sysname release version nodename machine login user
"Windows" "10 x64" "build 19042" "DESKTOP-NU5UDHD" "x86-64" "Galen" "Galen"
effective_user
"Galen"
Purpose here is primarily to go through some plots, look at them, and make static versions for the paper. This is mostly a copy-paste and translate over from metabolismLocalAndStatic. I’ve done this to split out the data read-in, function definitions, and plotting (and particularly the plot trying-out). I’ve been using these notebooks for plot testing, because it’s really nice to be able to scroll around and see what we’ve done, rather than have to keep re-making plot objects when we forget what they look like.
The catch with this approach is the quick and dirty prototyping isn’t quite so quick, and this document ends up taking FOREVER to load. Might switch back? But it sure is nice to actually see what each figure I made looks like, especially when we’re likely to drop this for extended periods.
Set the date for examples
Static versions with drivers and outcomes
Make a static version using the tmap functions
Clean that up just a bit, with a grey background. probably pull the title off but it’s nice to have as reference while i’m making these

I think for completeness let’s make a ggplot version too and see which is better. Takes more work, but have more control (probably just because I speak ggplot)

Code block to print and make those into figs
null device
1
null device
1
null device
1
null device
1
Uncertainty
I think now that I have the functions, there’s a slicker way to do this, but I don’t want to reinvent the wheel at this point. Might want to turn this into a function?
ER

GPP

Combine the ER and GPP and save as figures
png
2
png
2

Bar charts
Make a wide version of the data so I can have mins and maxes OR, should I do all of them and fct_order them?
Joining seems safe, but geographic joins are a mess. It doesn’t work at all. binding cols is actually safer and works
GPP
Maybe for a subset of wetlands?
[1] 3

null device
1
null device
1
I assume it is a mess to just throw them all on actually, with a fair amount of monkeying with the look, that’s OK
executing %dopar% sequentially: no parallel backend registered

Those breaks are really tough to sort out.
I actually like that that encompasses an area that integrates to total production across the Werai
*Aside- why do the errors look smaller when I aggregate to catchment scale in the _Basin plot doc?*
I should be able to look at that by summing here- I think it has to do with the logging, but I want to make sure.
The way to do this to match is add up the non-logged, then log the outcome. That way I’m adding arithmetically, not goofing up and mulitplying

So, that does look roughly like what I’m getting for the catchment aggregations. I have done the local errors correctly (ie on the linear scale, then logged), (see gpp_sPU creation above). So this is the consequence of the errors looking relatively smaller as they’re combined and on the log scale.
I can do points as below, but the integration implied above is nice.
This actually looks better if I plot it against inundation (or log inundation) as a continuous variable

This actually might look better if I plot it against inundation (or log inundation) as a continuous variable. Well, but that just recapitulates the multiplication, so pretty boring. I guess it shows that small deviations are due to temp? Still, kind of lame.

ER
Setup block. Again, this could be sorted with a function, but right now just copy-pasting
Barplot

Both together, with GPP up and ER down
Setup
Try a plot

The ranked x might make more sense? Easier to read, anyway.
Make the plot. Interesting that the notebook plotter does a worse job than the plots panel for a script. The funny gaps aren’t really there- to see, run barboth in the console.

Save those as figures
null device
1
null device
1
null device
1
null device
1
What about Darren’s fingerprints? They would maybe take the GPP and ER and make a density with them? OUt of what? The wetlands? Could work. Would need to sort out the weighting by volume. it’s already in there, but that means it will give each location the same weight. I think a better thing for the fingerprints would be to remove it, and then give each wetland its predicted per liter rate and weight by volume IE use the straight predictions and then weight by inundaton Should be straightforward, but likely won’t be
Would be a really cool way to look at scenarios. especially if I can do it for whole catchments
BUT, because GPP and ER are both linear fits of temp, they will exactly predict each other according to a linear relationship, and so there won’t be any 2-d variation and all the points will fall on a line. IE for a given GPP there will only be one ER, and so the fingerprint will be a line. Cool idea, but we’d need more info about their variance relative to each other
Annual reporting
What about making some examples to illustrate annual (or arbitrary time period) reporting?
First, establish the time periods and do the aggregations and other data organisation.
USE MAX ACROSS TIME FOR THE BIMONTHLY MAX EXTENTS- THAT GIVES A YEARLY MAX SINCE THE MEAN IS MEANINGLESS
This is all done in the metabPlotSetup_Local.
Simple feature collection with 5815 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 1086148 ymin: -3924954 xmax: 1148710 ymax: -3893940
Projected CRS: GDA94 / Australian Albers
[1] 3.300234
[1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0
Simple feature collection with 5815 features and 3 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 1086148 ymin: -3924954 xmax: 1148710 ymax: -3893940
Projected CRS: GDA94 / Australian Albers
[1] 3.679612
[1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0
I don’t think I use this, but I did make a full-werai aggregation. SUM across space is fine.
Tmap Plots
Make a facetted tmap
Again, can I do this by modifying what I pass to the plotting functions? Almost certainly
The units are weird, because this is added up across bimonths. It’s neither the total or the average.Not really sure what to call it
Change the tmap_mode() depending on the purpose. DO NOT CHANGE TO VIEW AND TRY TO RUN HERE. IF YOU WANT TO VIEW, CHANGE AND RUN IN CONSOLE. The markdown will run it, but incredibly slowly.
GPP
tmap mode set to plotting

ER

GGPLOT
gpp

ER

What do the drivers look like for those years?
Temp

Inundation

Stack 3 years of gpp and ER together for the document

Print out the ggplots for the doc
null device
1
null device
1
Same, but for the drivers (to go in appendix, probably)

Print out the ggplots for the doc
null device
1
null device
1
Scenarios
Want to base this pretty closely on the basin-scale scenarios. But it would be nice if I came up with some plots that actually measure the change, too. Maybe just change from baseline? ie scene x - baseline? On absolute or relative scale? as maps? As barplots with baseline @ 0?
Make all the plots. Ah, but the basin-scale (where this is sorted out) uses annual stars created in the setup file, while here I’ve used xxxYear_sf created in this rmd.The way I do it for the basin is better, but do I have the memory to do it that way here, or will I need to delete all the Years_sf objects and change how all that is done?
Well, wait. I already have erannual and gppannual and inunannual and tempannual here as stars. so I think I don’t need to go wholly remake things. Instead, how do I get to those (and why didn’t I use them above???- I then go make the sfs with them, but that’s what gets made inside the plotting functions, so not sure why I needed them.
scaling that works for all years fails to show what’s happenign because years are so different
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
bimonth_tempC 26.15685 28.22505 29.07994 29.03711 29.85284 31.99208
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
bimonth_tempC 28.15685 30.22505 31.07994 31.03711 31.85284 33.99208
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
volumeML 0 0 0.1267845 10.87692 1.997154 2321.797
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
volumeML 0 0 0.1394629 11.96461 2.196869 2553.977
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
predicted_GPP_kg02perday_at_max_inun 0 0 0.1235392 11.90138 2.77873 1995.336
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
predict_x_vol10p_GPPdaysvalleys 0 0 0.1432001 13.68594 3.176889 2314.403
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
predicted_ER_kg02perday_at_max_inun 0 0 0.294146 27.01615 6.312382 4781.027
dimension(s):
stars object with 2 dimensions and 1 attribute
attribute(s):
Min. 1st Qu. Median Mean 3rd Qu. Max.
predict_x_vol10p_ERdaysvalleys 0 0 0.3374814 30.99633 7.242361 5485.397
dimension(s):
GPP
ER
Inputs
Make the plots

null device
1
null device
1
Same, with ER

[1] "strictOut/metabolism/local"
LS0tDQp0aXRsZTogIkxvY2FsIE1ldGFib2xpc20gUGxvdHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyIHNldHVwfQ0KIyBzZXQgdGhlIHJvb3QgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5LCBub3QgdGhlIHJtZCBkaXJlY3RvcnkNCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gcnByb2pyb290OjpmaW5kX3JzdHVkaW9fcm9vdF9maWxlKCkpDQojIGRlZmF1bHQgdG8gbm90IHByaW50aW5nIHRoZSBjb2RlDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KDQojIGxpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzdGFycykNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkodHJhbnNmb3JtcikgIyBub3QgbmVlZGVkIGZvciB0aGlzIGRvYyBhdCBwcmVzZW50Pw0KbGlicmFyeShnZ2FuaW1hdGUpICMgbm90IG5lZWRlZCBoZXJlIGF0IHByZXNlbnQNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkoY29sb3JzcGFjZSkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCiMgc291cmNlIGluIHRoZSBkYXRhIG1hbmFnZW1lbnQNCg0KIyBLaW5kIG9mIGhhY2t5IGNoZWNrIHRvIG9ubHkgcnVuIGlmIG5lZWRlZA0KaWYgKCEoJ3dlcmFpQ3JvcEludW4nICVpbiUgbHMoKSkpIHsNCiAgICBzb3VyY2UoZmlsZS5wYXRoKGhlcmU6OmhlcmUoKSwgJ1NjcmlwdHMnLCAnU2NlbmFyaW9zJywgJ3Bsb3R0aW5nJywgJ21ldGFiUGxvdFNldHVwX0xvY2FsLlInKSkNCn0NCg0KYGBgDQoNClB1cnBvc2UgaGVyZSBpcyBwcmltYXJpbHkgdG8gZ28gdGhyb3VnaCBzb21lIHBsb3RzLCBsb29rIGF0IHRoZW0sIGFuZCBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgdGhlIHBhcGVyLg0KVGhpcyBpcyBtb3N0bHkgYSBjb3B5LXBhc3RlIGFuZCB0cmFuc2xhdGUgb3ZlciBmcm9tIG1ldGFib2xpc21Mb2NhbEFuZFN0YXRpYy4gSSd2ZSBkb25lIHRoaXMgdG8gc3BsaXQgb3V0IHRoZSBkYXRhIHJlYWQtaW4sIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBhbmQgcGxvdHRpbmcgKGFuZCBwYXJ0aWN1bGFybHkgdGhlIHBsb3QgdHJ5aW5nLW91dCkuIEkndmUgYmVlbiB1c2luZyB0aGVzZSBub3RlYm9va3MgZm9yIHBsb3QgdGVzdGluZywgYmVjYXVzZSBpdCdzIHJlYWxseSBuaWNlIHRvIGJlIGFibGUgdG8gc2Nyb2xsIGFyb3VuZCBhbmQgc2VlIHdoYXQgd2UndmUgZG9uZSwgcmF0aGVyIHRoYW4gaGF2ZSB0byBrZWVwIHJlLW1ha2luZyBwbG90IG9iamVjdHMgd2hlbiB3ZSBmb3JnZXQgd2hhdCB0aGV5IGxvb2sgbGlrZS4NCg0KKlRoZSBjYXRjaCB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhlIHF1aWNrIGFuZCBkaXJ0eSBwcm90b3R5cGluZyBpc24ndCBxdWl0ZSBzbyBxdWljaywgYW5kIHRoaXMgZG9jdW1lbnQgZW5kcyB1cCB0YWtpbmcgRk9SRVZFUiB0byBsb2FkLiogTWlnaHQgc3dpdGNoIGJhY2s/IEJ1dCBpdCBzdXJlIGlzIG5pY2UgdG8gYWN0dWFsbHkgc2VlIHdoYXQgZWFjaCBmaWd1cmUgSSBtYWRlIGxvb2tzIGxpa2UsIGVzcGVjaWFsbHkgd2hlbiB3ZSdyZSBsaWtlbHkgdG8gZHJvcCB0aGlzIGZvciBleHRlbmRlZCBwZXJpb2RzLg0KDQpTZXQgdGhlIGRhdGUgZm9yIGV4YW1wbGVzDQpgYGB7cn0NCmF2YWlsRGF5cyA8LSBzdF9nZXRfZGltZW5zaW9uX3ZhbHVlcyh3ZXJhaUNyb3BUZW1wLCB3aGljaCA9ICd0aW1lJykNCmRhdGV3YW50ZWQgPC0gYXMuY2hhcmFjdGVyKGF2YWlsRGF5c1sxOF0pDQpgYGANCg0KDQojIyBTdGF0aWMgdmVyc2lvbnMgd2l0aCBkcml2ZXJzIGFuZCBvdXRjb21lcw0KTWFrZSBhIHN0YXRpYyB2ZXJzaW9uIHVzaW5nIHRoZSB0bWFwIGZ1bmN0aW9ucw0KYGBge3J9DQpzdXBwcmVzc01lc3NhZ2VzKHRtYXBfbW9kZSgncGxvdCcpKQ0KDQojIGFsbGZ1bih0ZW1wT2JqID0gd2VyYWlDcm9wVGVtcCwgdGVtcEF0dCA9IDEsDQojICAgICAgICAgICAgICAgICAgICBpbnVuT2JqID0gd2VyYWlDcm9wSW51biwgaW51bkF0dCA9IDEsDQojICAgICAgICAgICAgICAgICAgICBncHBPYmogPSB3ZXJhaUNyb3BQcmVkR1BQLCBncHBBdHQgPSAxLA0KIyAgICAgICAgICAgICAgICAgICAgZXJPYmogPSB3ZXJhaUNyb3BQcmVkRVIsIGVyQXR0ID0gMSwNCiMgICAgICAgICAgICAgICAgICAgIGRhdGV3YW50ZWQpDQoNCmBgYA0KDQpDbGVhbiB0aGF0IHVwIGp1c3QgYSBiaXQsIHdpdGggYSBncmV5IGJhY2tncm91bmQuIHByb2JhYmx5IHB1bGwgdGhlIHRpdGxlIG9mZiBidXQgaXQncyBuaWNlIHRvIGhhdmUgYXMgcmVmZXJlbmNlIHdoaWxlIGknbSBtYWtpbmcgdGhlc2UNCg0KYGBge3J9DQp0bV9ncmlkX3N0YXRpYyA8LSB0bWFwX2FycmFuZ2UodGVtcGZ1bih3ZXJhaUNyb3BUZW1wLCAxLCBkYXRld2FudGVkKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9sYXlvdXQoYmcuY29sb3IgPSAiZ3JleTg1IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW51bmZ1bih3ZXJhaUNyb3BJbnVuLCAxLCBkYXRld2FudGVkLCB0aXRsZWQgPSBGQUxTRSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fbGF5b3V0KGJnLmNvbG9yID0gImdyZXk4NSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcGZ1bih3ZXJhaUNyb3BQcmVkR1BQLCAxLCBkYXRld2FudGVkLCB0aXRsZWQgPSBGQUxTRSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fbGF5b3V0KGJnLmNvbG9yID0gImdyZXk4NSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyZnVuKHdlcmFpQ3JvcFByZWRFUiwgMSwgZGF0ZXdhbnRlZCwgdGl0bGVkID0gRkFMU0UpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX2xheW91dChiZy5jb2xvciA9ICJncmV5ODUiKSkNCnRtX2dyaWRfc3RhdGljDQpgYGANCg0KSSB0aGluayBmb3IgY29tcGxldGVuZXNzIGxldCdzIG1ha2UgYSBnZ3Bsb3QgdmVyc2lvbiB0b28gYW5kIHNlZSB3aGljaCBpcyBiZXR0ZXIuDQpUYWtlcyBtb3JlIHdvcmssIGJ1dCBoYXZlIG1vcmUgY29udHJvbCAocHJvYmFibHkganVzdCBiZWNhdXNlIEkgc3BlYWsgZ2dwbG90KQ0KDQpgYGB7cn0NCmdnX2dyaWRfc3RhdGljIDwtIGdncHVicjo6Z2dhcnJhbmdlKA0KICB0ZW1wZnVuKHdlcmFpQ3JvcFRlbXAsIDEsIGRhdGV3YW50ZWQsIHRpdGxlZCA9IEZBTFNFLA0KICAgICAgICAgIHRpdGxlUHJlZml4ID0gJ1R3byBtb250aHMgcHJlY2VkaW5nICcsIHBsb3RQa2cgPSAnZ2dwbG90JykgKyANCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICd0b3AnKSkgKw0KICAgIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgDQogICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSwNCiAgaW51bmZ1bih3ZXJhaUNyb3BJbnVuLCAxLCBkYXRld2FudGVkLCB0aXRsZWQgPSBGQUxTRSwgcGxvdFBrZyA9ICdnZ3Bsb3QnKSArIA0KICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcpKSArDQogICAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nLCANCiAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpLA0KICBncHBmdW4od2VyYWlDcm9wUHJlZEdQUCwgMSwgZGF0ZXdhbnRlZCwgdGl0bGVkID0gRkFMU0UsIHBsb3RQa2cgPSAnZ2dwbG90JykgKyANCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICd0b3AnKSkgKw0KICAgIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgDQogICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSwNCiAgZXJmdW4od2VyYWlDcm9wUHJlZEVSLCAxLCBkYXRld2FudGVkLCB0aXRsZWQgPSBGQUxTRSwgcGxvdFBrZyA9ICdnZ3Bsb3QnKSArIA0KICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcpKSArDQogICAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nLCANCiAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpLA0KICBuY29sID0gMiwgbnJvdyA9IDIpDQpwcmludChnZ19ncmlkX3N0YXRpYykNCg0KYGBgDQoNCkNvZGUgYmxvY2sgdG8gcHJpbnQgYW5kIG1ha2UgdGhvc2UgaW50byBmaWdzDQpgYGB7cn0NCnBkZihmaWxlLnBhdGgoc2NyaXB0T3V0LCAnV2VyYWlfdG0ucGRmJyksIA0KICAgIG9uZWZpbGUgPSBGQUxTRSwgaGVpZ2h0ID0gMTIvMi41NCwgd2lkdGggPSAxNi8yLjU0LCB1c2VEaW5nYmF0cyA9IEZBTFNFKQ0KcHJpbnQodG1fZ3JpZF9zdGF0aWMpDQpkZXYub2ZmKCkNCg0KcG5nKGZpbGUucGF0aChzY3JpcHRPdXQsICdXZXJhaV90bS5wbmcnKSwgDQogICAgaGVpZ2h0ID0gMTIvMi41NCwgd2lkdGggPSAxNi8yLjU0LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkNCnByaW50KHRtX2dyaWRfc3RhdGljKQ0KZGV2Lm9mZigpDQoNCiMgQ2FuIEkgcHJpbnQgdGhvc2U/DQpwZGYoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ1dlcmFpX2dnLnBkZicpLCANCiAgICBvbmVmaWxlID0gRkFMU0UsIGhlaWdodCA9IDEyLzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdXNlRGluZ2JhdHMgPSBGQUxTRSkNCnByaW50KGdnX2dyaWRfc3RhdGljKQ0KZGV2Lm9mZigpDQoNCnBuZyhmaWxlLnBhdGgoc2NyaXB0T3V0LCAnV2VyYWlfZ2cucG5nJyksIA0KICAgIGhlaWdodCA9IDEyLzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApDQpwcmludChnZ19ncmlkX3N0YXRpYykNCmRldi5vZmYoKQ0KYGBgDQoNCiMjIFVuY2VydGFpbnR5DQoNCkkgdGhpbmsgbm93IHRoYXQgSSBoYXZlIHRoZSBmdW5jdGlvbnMsIHRoZXJlJ3MgYSBzbGlja2VyIHdheSB0byBkbyB0aGlzLCBidXQgSSBkb24ndCB3YW50IHRvIHJlaW52ZW50IHRoZSB3aGVlbCBhdCB0aGlzIHBvaW50LiBNaWdodCB3YW50IHRvIHR1cm4gdGhpcyBpbnRvIGEgZnVuY3Rpb24/DQoNCiMjIyBFUg0KDQpgYGB7cn0NCiMgRVINCmVyX3NmIDwtIHdlcmFpQ3JvcFByZWRFUlsxLCxdICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIHNlbGVjdChhbGxfb2YoZGF0ZXdhbnRlZCkpICU+JQ0KICByZW5hbWUoRVIgPSAxKSAlPiUNCiAgbXV0YXRlKGxvZ0VSID0gbG9nMTAoMStFUiksIHR5cGUgPSAnZXN0aW1hdGUnKQ0KZXJfc2ZQVSA8LSB3ZXJhaUNyb3BQcmVkRVJbMiwsXSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBzZWxlY3QoYWxsX29mKGRhdGV3YW50ZWQpKSAlPiUNCiAgcmVuYW1lKEVSID0gMSkgJT4lDQogIG11dGF0ZShsb2dFUiA9IGxvZzEwKDErRVIpLCB0eXBlID0gJ3VwcGVyJykNCmVyX3NmUEwgPC0gd2VyYWlDcm9wUHJlZEVSWzMsLF0gJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgc2VsZWN0KGFsbF9vZihkYXRld2FudGVkKSkgJT4lDQogIHJlbmFtZShFUiA9IDEpICU+JQ0KICBtdXRhdGUobG9nRVIgPSBsb2cxMCgxK0VSKSwgdHlwZSA9ICdsb3dlcicpDQoNCmVyX3NmX0xNVSA8LSBiaW5kX3Jvd3MoZXJfc2YsIGVyX3NmUFUsIGVyX3NmUEwpICU+JQ0KICBtdXRhdGUobmFtZWRQSSA9IGlmZWxzZSh0eXBlID09ICdsb3dlcicsICJMb3dlciA5NSUgUEkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHlwZSA9PSAnZXN0aW1hdGUnLCAiRXN0aW1hdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gJ3VwcGVyJywgIlVwcGVyIDk1JSBQSSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTQ1JFV1VQJykpKSkNCg0KZXJsYWJlbCA8LSAnRVIgKGtnIDAyL2RheSlcbmF0IG1heCBleHRlbnQnDQoNCiMgQ2FuIGdldCBhd2F5IHdpdGggdGhpcyBiZWNhdXNlIHByZXR0eSByYW5nZXMgd29yayBvdXQgT0sNCmVyQ29udHJvbCA8LSBlcnNldHVwKGRhdGEgPSB3ZXJhaUNyb3BQcmVkRVIsIGF0dG51bSA9IDEpDQoNCiAgZXJfZ2dfdW5jZXJ0YWluIDwtIGdncGxvdCgpICsNCiAgICBnZW9tX3NmKGRhdGEgPSBlcl9zZl9MTVUsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IGxvZ0VSKSwgY29sb3IgPSBOQSkgKw0KICAgICMgZ2VvbV9zZl9sYWJlbChkYXRhID0gbHRpbU5vTm9ydGgsIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBWYWxsZXlOYW1lKSkgKw0KICAgIGNvb3JkX3NmKCkgKw0KICAgICMgQ2xvc2VzdCB0byB0aGUgdG1hcA0KICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGVyQ29udHJvbCRlcnBhbCwNCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBlckNvbnRyb2wkZXJicmVha3NbMjpsZW5ndGgoZXJDb250cm9sJGVyYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oZXJDb250cm9sJGVyYnJlYWtzKSwgbWF4KGVyQ29udHJvbCRlcmJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGVyQ29udHJvbCRlcmxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlcmxhYmVsKSArDQogICAgZmFjZXRfZ3JpZChmY3RfcmVvcmRlcihuYW1lZFBJLCAueCA9IGxvZ0VSLCAuZnVuID0gbWF4KX4uKSAjIGxvd2VyLCBlc3RpbWF0IGFuZCB1cHBlciBzaG91bGQgYWx3YXlzIGZhbGwgaW4gdGhhdCBvcmRlciBmb3IgdGhlaXIgbWF4ZXMNCg0KZXJfZ2dfdW5jZXJ0YWluDQoNCmBgYA0KDQojIyMgR1BQDQoNCmBgYHtyfQ0KDQoNCiMgR1BQDQojIEknbSBzdXJlIHRoZXJlJ3MgYSBzbGljayB3YXkgdG8gc2VsZWN0IGFsbCB0aHJlZSBhdHRyaWJ1dGVzIGFuZCBkbyB0aGlzIGluIG9uZQ0KIyBnbywgYnV0IEkganVzdCBuZWVkIHRvIGdldCB0aGlzIGRvbmUNCmdwcF9zZiA8LSB3ZXJhaUNyb3BQcmVkR1BQWzEsLF0gJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgc2VsZWN0KGFsbF9vZihkYXRld2FudGVkKSkgJT4lDQogIHJlbmFtZShHUFAgPSAxKSAlPiUNCiAgbXV0YXRlKGxvZ0dQUCA9IGxvZzEwKDErR1BQKSwgdHlwZSA9ICdlc3RpbWF0ZScpDQpncHBfc2ZQVSA8LSB3ZXJhaUNyb3BQcmVkR1BQWzIsLF0gJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgc2VsZWN0KGFsbF9vZihkYXRld2FudGVkKSkgJT4lDQogIHJlbmFtZShHUFAgPSAxKSAlPiUNCiAgbXV0YXRlKGxvZ0dQUCA9IGxvZzEwKDErR1BQKSwgdHlwZSA9ICd1cHBlcicpDQpncHBfc2ZQTCA8LSB3ZXJhaUNyb3BQcmVkR1BQWzMsLF0gJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgc2VsZWN0KGFsbF9vZihkYXRld2FudGVkKSkgJT4lDQogIHJlbmFtZShHUFAgPSAxKSAlPiUNCiAgbXV0YXRlKGxvZ0dQUCA9IGxvZzEwKDErR1BQKSwgdHlwZSA9ICdsb3dlcicpDQoNCmdwcF9zZl9MTVUgPC0gYmluZF9yb3dzKGdwcF9zZiwgZ3BwX3NmUFUsIGdwcF9zZlBMKSAlPiUNCiAgbXV0YXRlKG5hbWVkUEkgPSBpZmVsc2UodHlwZSA9PSAnbG93ZXInLCAiTG93ZXIgOTUlIFBJIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHR5cGUgPT0gJ2VzdGltYXRlJywgIkVzdGltYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0eXBlID09ICd1cHBlcicsICJVcHBlciA5NSUgUEkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0NSRVdVUCcpKSkpDQoNCmdwcGxhYmVsIDwtICdHUFAgKGtnIDAyL2RheSlcbmF0IG1heCBleHRlbnQnDQoNCmdwcENvbnRyb2wgPC0gZ3Bwc2V0dXAod2VyYWlDcm9wUHJlZEdQUCwgYXR0bnVtICA9IDEpDQoNCmdwcF9nZ191bmNlcnRhaW4gPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBncHBfc2ZfTE1VLCBtYXBwaW5nID0gYWVzKGZpbGwgPSBsb2dHUFApLCBjb2xvciA9IE5BKSArDQogICMgZ2VvbV9zZl9sYWJlbChkYXRhID0gbHRpbU5vTm9ydGgsIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBWYWxsZXlOYW1lKSkgKw0KICBjb29yZF9zZigpICsNCiAgIyBDbG9zZXN0IHRvIHRoZSB0bWFwDQogIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGdwcENvbnRyb2wkZ3BwcGFsLA0KICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBncHBDb250cm9sJGdwcGJyZWFrc1syOmxlbmd0aChncHBDb250cm9sJGdwcGJyZWFrcyldLA0KICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihncHBDb250cm9sJGdwcGJyZWFrcyksIG1heChncHBDb250cm9sJGdwcGJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBncHBDb250cm9sJGdwcGxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAnbGVnZW5kJywNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdwcGxhYmVsKSArDQogIGZhY2V0X2dyaWQoZmN0X3Jlb3JkZXIobmFtZWRQSSwgLnggPSBsb2dHUFAsIC5mdW4gPSBtYXgpfi4pICMgbG93ZXIsIGVzdGltYXQgYW5kIHVwcGdwcCBzaG91bGQgYWx3YXlzIGZhbGwgaW4gdGhhdCBvcmRncHAgZm9yIHRoZWlyIG1heGVzDQoNCmdwcF9nZ191bmNlcnRhaW4NCmBgYA0KDQpDb21iaW5lIHRoZSBFUiBhbmQgR1BQIGFuZCBzYXZlIGFzIGZpZ3VyZXMNCg0KYGBge3J9DQpib3RoX3VuY2VydGFpbiA8LSBnZ3B1YnI6OmdnYXJyYW5nZShncHBfZ2dfdW5jZXJ0YWluICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcl9nZ191bmNlcnRhaW4gKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAndG9wJykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxKQ0KYm90aF91bmNlcnRhaW4NCg0KIyBKdXN0IHByaW50IHRoZSBnZ3Bsb3RzDQojIENhbiBJIHByaW50IHRob3NlPw0KcGRmKGZpbGUucGF0aChzY3JpcHRPdXQsICdXZXJhaV91bmNlcnRhaW50eS5wZGYnKSwgDQogICAgb25lZmlsZSA9IEZBTFNFLCBoZWlnaHQgPSAxMi8yLjU0LCB3aWR0aCA9IDE2LzIuNTQsIHVzZURpbmdiYXRzID0gRkFMU0UpDQpwcmludChib3RoX3VuY2VydGFpbikNCmRldi5vZmYoKQ0KDQpwbmcoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ1dlcmFpX3VuY2VydGFpbnR5LnBuZycpLCANCiAgICBoZWlnaHQgPSAxMi8yLjU0LCB3aWR0aCA9IDE2LzIuNTQsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQ0KcHJpbnQoYm90aF91bmNlcnRhaW4pDQpkZXYub2ZmKCkNCmBgYA0KDQojIyBCYXIgY2hhcnRzDQpNYWtlIGEgd2lkZSB2ZXJzaW9uIG9mIHRoZSBkYXRhIHNvIEkgY2FuIGhhdmUgbWlucyBhbmQgbWF4ZXMNCk9SLCBzaG91bGQgSSBkbyBhbGwgb2YgdGhlbSBhbmQgZmN0X29yZGVyIHRoZW0/DQoNCkpvaW5pbmcgc2VlbXMgc2FmZSwgYnV0IGdlb2dyYXBoaWMgam9pbnMgYXJlIGEgbWVzcy4gSXQgZG9lc24ndCB3b3JrIGF0IGFsbC4NCmJpbmRpbmcgY29scyBpcyBhY3R1YWxseSBzYWZlciBhbmQgd29ya3MNCiANCiMjIyBHUFANCg0KYGBge3J9DQojIEdldCB0aGUgaW51bmRhdGlvbiB0byBnbHVlIG9uIHRvbw0KaW51bl9zZiA8LSB3ZXJhaUNyb3BJbnVuWzEsLF0gJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgc2VsZWN0KGFsbF9vZihkYXRld2FudGVkKSkgJT4lDQogIHJlbmFtZShpbnVuID0gMSkgJT4lDQogIG11dGF0ZShsb2dJbnVuID0gbG9nMTAoMStpbnVuKSkNCg0KZ3BwX3NmX0xNVV93aWRlIDwtIGJpbmRfY29scyhncHBfc2ZbLC00XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9kcm9wX2dlb21ldHJ5KHJlbmFtZShncHBfc2ZQVVssLWMoNCldLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVR1BQID0gR1BQLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9sb2dHUFAgPSBsb2dHUFApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2Ryb3BfZ2VvbWV0cnkocmVuYW1lKGdwcF9zZlBMWywtNF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExHUFAgPSBHUFAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfbG9nR1BQID0gbG9nR1BQKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9kcm9wX2dlb21ldHJ5KGludW5fc2YpKSAlPiUNCiAgDQogIG11dGF0ZSh3ZXRsYW5kSUQgPSByb3dfbnVtYmVyKCkpDQpgYGANCg0KTWF5YmUgZm9yIGEgc3Vic2V0IG9mIHdldGxhbmRzPw0KDQpgYGB7cn0NCiMgR3JhYiBzb21lIHNldCBvZiB3ZXRsYW5kcw0Kd2hpY2goZ3BwX3NmJGdlb21ldHJ5ID09IGdwcF9zZl9MTVUkZ2VvbWV0cnlbM10pDQpleGFtcGxlV2V0cyA8LSBjKDE6MTAwKQ0KYGBgDQoNCmBgYHtyfQ0KYmFyZ3BwIDwtIGdncGxvdChncHBfc2ZfTE1VX3dpZGVbZXhhbXBsZVdldHMsIF0sIA0KICAgICAgICAgICAgICAgICBhZXMoeCA9IHdldGxhbmRJRCwgeSA9IGxvZ0dQUCwgZmlsbCA9IGxvZ0dQUCkpICsNCiAgZ2VvbV9jb2woKSArICMgdGhlIGdlb21fYmFyIGVxdWl2YWxlbnQgd2hlbiBpdCdzIG5vdCBjb3VudGluZyBjYXNlcy4NCiAgZ2VvbV9saW5lcmFuZ2UobWFwcGluZyA9IGFlcyh5bWluID0gbG93ZXJfbG9nR1BQLCB5bWF4ID0gdXBwZXJfbG9nR1BQKSwgY29sb3IgPSAnZ3JleTUwJykgKw0KICBzY2FsZV9maWxsX3N0ZXBzbihjb2xvcnMgPSBncHBDb250cm9sJGdwcHBhbCwNCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oZ3BwQ29udHJvbCRncHBicmVha3MpLCBtYXgoZ3BwQ29udHJvbCRncHBicmVha3MpKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3BwQ29udHJvbCRncHBsYWJlbHMsDQogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBncHBsYWJlbCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHJvdW5kKDEwXihncHBDb250cm9sJGdwcGJyZWFrc1syOmxlbmd0aChncHBDb250cm9sJGdwcGJyZWFrcyldKSkpICsNCiAgbGFicyh4ID0gJ1dldGxhbmQnLCB5ID0gZ3BwbGFiZWwpDQpiYXJncHANCg0KYGBgDQpgYGB7cn0NCnBkZihmaWxlLnBhdGgoc2NyaXB0T3V0LCAnRmV3R1BQYmFycy5wZGYnKSwgDQogICAgb25lZmlsZSA9IEZBTFNFLCBoZWlnaHQgPSA4LzIuNTQsIHdpZHRoID0gMTIvMi41NCwgdXNlRGluZ2JhdHMgPSBGQUxTRSkNCnByaW50KGJhcmdwcCkNCmRldi5vZmYoKQ0KDQpwbmcoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ0Zld0dQUGJhcnMucG5nJyksIA0KICAgIGhlaWdodCA9IDgvMi41NCwgd2lkdGggPSAxMi8yLjU0LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkNCnByaW50KGJhcmdwcCkNCmRldi5vZmYoKQ0KYGBgDQoNCiBJIGFzc3VtZSBpdCBpcyBhIG1lc3MgdG8ganVzdCB0aHJvdyB0aGVtIGFsbCBvbg0KIGFjdHVhbGx5LCB3aXRoIGEgZmFpciBhbW91bnQgb2YgbW9ua2V5aW5nIHdpdGggdGhlIGxvb2ssIHRoYXQncyBPSw0KIA0KYGBge3J9DQojIEdldCB4IGJyZWFrcyB0aGF0IGV4aXN0IHdoZW4gZGlzY3JldGl6ZWQNCmJyZWFrc3dhbnRlZCA8LSBjKDAsIDEsIDEwLCAxMDAsIDEwMDApDQp4YnJlYWtzIDwtIGZvcmVhY2goYiA9IGJyZWFrc3dhbnRlZCwgLmNvbWJpbmUgPSBjKSAlZG9wYXIlIHsNCiAgICBncHBfc2ZfTE1VX3dpZGUkaW51blt3aGljaC5taW4oYWJzKGdwcF9zZl9MTVVfd2lkZSRpbnVuIC0gYikpXQ0KfSANCg0KYmFyZ3BwYWxsIDwtIGdncGxvdChncHBfc2ZfTE1VX3dpZGUsIA0KICAgICAgICAgICAgICAgICBhZXMoeCA9IGZjdF9yZXYoYXMuZmFjdG9yKGludW4pKSwgIyBmY3RfcmVvcmRlcihhcy5mYWN0b3Iod2V0bGFuZElEKSwgaW51biwgLmRlc2MgPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgICAgICB5ID0gbG9nR1BQLCBmaWxsID0gbG9nR1BQKSkgKw0KICBnZW9tX2NvbCgpICsgIyB0aGUgZ2VvbV9iYXIgZXF1aXZhbGVudCB3aGVuIGl0J3Mgbm90IGNvdW50aW5nIGNhc2VzLg0KICBnZW9tX2xpbmVyYW5nZShtYXBwaW5nID0gYWVzKHltaW4gPSBsb3dlcl9sb2dHUFAsIHltYXggPSB1cHBlcl9sb2dHUFApLA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICdncmV5NTAnLCBhbHBoYSA9IDAuMikgKw0KICBzY2FsZV9maWxsX3N0ZXBzbihjb2xvcnMgPSBncHBDb250cm9sJGdwcHBhbCwNCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oZ3BwQ29udHJvbCRncHBicmVha3MpLCBtYXgoZ3BwQ29udHJvbCRncHBicmVha3MpKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3BwQ29udHJvbCRncHBsYWJlbHMsDQogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBncHBsYWJlbCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHJvdW5kKDEwXihncHBDb250cm9sJGdwcGJyZWFrc1syOmxlbmd0aChncHBDb250cm9sJGdwcGJyZWFrcyldKSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBhcy5jaGFyYWN0ZXIoeGJyZWFrcyksIGxhYmVscyA9IGFzLmNoYXJhY3Rlcihyb3VuZCh4YnJlYWtzKSkpICsNCiAgbGFicyh5ID0gZ3BwbGFiZWwsIHggPSAnSW51bmRhdGlvbiB2b2x1bWUgKE1sIGF0IG1heCBleHRlbnQpJykNCmJhcmdwcGFsbA0KYGBgDQogDQogDQpUaG9zZSBicmVha3MgYXJlIHJlYWxseSB0b3VnaCB0byBzb3J0IG91dC4NCg0KSSBhY3R1YWxseSBsaWtlIHRoYXQgdGhhdCBlbmNvbXBhc3NlcyBhbiBhcmVhIHRoYXQgaW50ZWdyYXRlcyB0byB0b3RhbCBwcm9kdWN0aW9uIGFjcm9zcyB0aGUgV2VyYWkNCg0KKkFzaWRlLSB3aHkgZG8gdGhlIGVycm9ycyBsb29rIHNtYWxsZXIgd2hlbiBJIGFnZ3JlZ2F0ZSB0byBjYXRjaG1lbnQgc2NhbGUgaW4gdGhlIF9CYXNpbiBwbG90IGRvYz8qDQoNCkkgc2hvdWxkIGJlIGFibGUgdG8gbG9vayBhdCB0aGF0IGJ5IHN1bW1pbmcgaGVyZS0gSSB0aGluayBpdCBoYXMgdG8gZG8gd2l0aCB0aGUgbG9nZ2luZywgYnV0IEkgd2FudCB0byBtYWtlIHN1cmUuIA0KDQpUaGUgd2F5IHRvIGRvIHRoaXMgdG8gbWF0Y2ggaXMgYWRkIHVwIHRoZSBub24tbG9nZ2VkLCB0aGVuIGxvZyB0aGUgb3V0Y29tZS4gVGhhdCB3YXkgSSdtIGFkZGluZyBhcml0aG1ldGljYWxseSwgbm90IGdvb2ZpbmcgdXAgYW5kIG11bGl0cGx5aW5nDQoNCmBgYHtyfQ0KZ3Bwc3VtIDwtIGdwcF9zZl9MTVVfd2lkZSAlPiUNCiAgc3RfZHJvcF9nZW9tZXRyeSgpICU+JQ0KICBzdW1tYXJpc2UoR1BQID0gc3VtKEdQUCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBVR1BQID0gc3VtKFVHUFAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgTEdQUCA9IHN1bShMR1BQLCBuYS5ybSA9IFRSVUUpKQ0KDQojIHRoaXMgaXMgZ29pbmcgdG8gYmUgc2lsbHkgYmVjYXVzZSBqdXN0IG9uZSBiYXINCmdncGxvdChncHBzdW0sIGFlcyh4ID0gJ3dlcmFpJywgeSA9IGxvZzEwKEdQUCArIDEpKSkgKw0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fbGluZXJhbmdlKG1hcHBpbmcgPSBhZXMoeW1pbiA9IGxvZzEwKExHUFAgKyAxKSwgeW1heCA9IGxvZzEwKFVHUFAgKyAxKSksDQogICAgICAgICAgICAgICAgIGNvbG9yID0gJ2JsYWNrJykNCiAgDQpgYGANCg0KU28sIHRoYXQgZG9lcyBsb29rIHJvdWdobHkgbGlrZSB3aGF0IEknbSBnZXR0aW5nIGZvciB0aGUgY2F0Y2htZW50IGFnZ3JlZ2F0aW9ucy4gSSBoYXZlIGRvbmUgdGhlIGxvY2FsIGVycm9ycyBjb3JyZWN0bHkgKGllIG9uIHRoZSBsaW5lYXIgc2NhbGUsIHRoZW4gbG9nZ2VkKSwgKHNlZSBncHBfc1BVIGNyZWF0aW9uIGFib3ZlKS4gU28gdGhpcyBpcyB0aGUgY29uc2VxdWVuY2Ugb2YgdGhlIGVycm9ycyBsb29raW5nIHJlbGF0aXZlbHkgc21hbGxlciBhcyB0aGV5J3JlIGNvbWJpbmVkIGFuZCBvbiB0aGUgbG9nIHNjYWxlLg0KDQoNCkkgY2FuIGRvIHBvaW50cyBhcyBiZWxvdywgYnV0IHRoZSBpbnRlZ3JhdGlvbiBpbXBsaWVkIGFib3ZlIGlzIG5pY2UuDQoNClRoaXMgYWN0dWFsbHkgbG9va3MgYmV0dGVyIGlmIEkgcGxvdCBpdCBhZ2FpbnN0IGludW5kYXRpb24gKG9yIGxvZyBpbnVuZGF0aW9uKSBhcyBhIGNvbnRpbnVvdXMgdmFyaWFibGUNCg0KYGBge3J9DQpiYXJncHBhbGxwb2ludCA8LSBnZ3Bsb3QoZ3BwX3NmX0xNVV93aWRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGZjdF9yZXYoYXMuZmFjdG9yKGludW4pKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2dHUFAsIGNvbG9yID0gbG9nR1BQKSkgKw0KICBnZW9tX2xpbmVyYW5nZShtYXBwaW5nID0gYWVzKHltaW4gPSBsb3dlcl9sb2dHUFAsIHltYXggPSB1cHBlcl9sb2dHUFApLCBjb2xvciA9ICdncmV5NTAnKSArDQogIGdlb21fcG9pbnQoKSArICMgdGhlIGdlb21fYmFyIGVxdWl2YWxlbnQgd2hlbiBpdCdzIG5vdCBjb3VudGluZyBjYXNlcy4NCiAgc2NhbGVfY29sb3Jfc3RlcHNuKGNvbG9ycyA9IGdwcENvbnRyb2wkZ3BwcGFsLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKGdwcENvbnRyb2wkZ3BwYnJlYWtzKSwgbWF4KGdwcENvbnRyb2wkZ3BwYnJlYWtzKSksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBncHBDb250cm9sJGdwcGxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gZ3BwbGFiZWwpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGdwcENvbnRyb2wkZ3BwYnJlYWtzWzI6bGVuZ3RoKGdwcENvbnRyb2wkZ3BwYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSByb3VuZCgxMF4oZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSkpKSArDQogIGxhYnMoeCA9ICdJbnVuZGF0aW9uIHZvbHVtZSAoTWwgYXQgbWF4IGV4dGVudCknLCB5ID0gZ3BwbGFiZWwpDQpiYXJncHBhbGxwb2ludA0KYGBgDQoNClRoaXMgYWN0dWFsbHkgbWlnaHQgbG9vayBiZXR0ZXIgaWYgSSBwbG90IGl0IGFnYWluc3QgaW51bmRhdGlvbiAob3IgbG9nIGludW5kYXRpb24pIGFzIGEgY29udGludW91cyB2YXJpYWJsZS4gV2VsbCwgYnV0IHRoYXQganVzdCByZWNhcGl0dWxhdGVzIHRoZSBtdWx0aXBsaWNhdGlvbiwgc28gcHJldHR5IGJvcmluZy4gSSBndWVzcyBpdCBzaG93cyB0aGF0IHNtYWxsIGRldmlhdGlvbnMgYXJlIGR1ZSB0byB0ZW1wPyBTdGlsbCwga2luZCBvZiBsYW1lLg0KDQpgYGB7cn0NCmJhcmdwcGFsbHBvaW50QyA8LSBnZ3Bsb3QoZ3BwX3NmX0xNVV93aWRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvZ0ludW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nR1BQLCBjb2xvciA9IGxvZ0dQUCkpICsNCiAgZ2VvbV9saW5lcmFuZ2UobWFwcGluZyA9IGFlcyh5bWluID0gbG93ZXJfbG9nR1BQLCB5bWF4ID0gdXBwZXJfbG9nR1BQKSwgY29sb3IgPSAnZ3JleTUwJykgKw0KICBnZW9tX3BvaW50KCkgKyAjIHRoZSBnZW9tX2JhciBlcXVpdmFsZW50IHdoZW4gaXQncyBub3QgY291bnRpbmcgY2FzZXMuDQogIHNjYWxlX2NvbG9yX3N0ZXBzbihjb2xvcnMgPSBncHBDb250cm9sJGdwcHBhbCwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGdwcENvbnRyb2wkZ3BwYnJlYWtzWzI6bGVuZ3RoKGdwcENvbnRyb2wkZ3BwYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihncHBDb250cm9sJGdwcGJyZWFrcyksIG1heChncHBDb250cm9sJGdwcGJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3BwQ29udHJvbCRncHBsYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdwcGxhYmVsKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBncHBDb250cm9sJGdwcGJyZWFrc1syOmxlbmd0aChncHBDb250cm9sJGdwcGJyZWFrcyldLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcm91bmQoMTBeKGdwcENvbnRyb2wkZ3BwYnJlYWtzWzI6bGVuZ3RoKGdwcENvbnRyb2wkZ3BwYnJlYWtzKV0pKSkgKw0KICBsYWJzKHggPSAnbG9nIEludW5kYXRpb24gdm9sdW1lIChNbCBhdCBtYXggZXh0ZW50KScsIHkgPSBncHBsYWJlbCkNCmJhcmdwcGFsbHBvaW50Qw0KYGBgDQoNCiMjIyBFUg0KDQpTZXR1cCBibG9jay4gQWdhaW4sIHRoaXMgY291bGQgYmUgc29ydGVkIHdpdGggYSBmdW5jdGlvbiwgYnV0IHJpZ2h0IG5vdyBqdXN0IGNvcHktcGFzdGluZw0KDQpgYGB7cn0NCmVybGFiZWwgPC0gJ0dQUCAoa2cgMDIvZGF5KVxuYXQgbWF4IGV4dGVudCcNCg0KZXJfc2ZfTE1VX3dpZGUgPC0gYmluZF9jb2xzKGVyX3NmWywtNF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9kcm9wX2dlb21ldHJ5KHJlbmFtZShlcl9zZlBVWywtYyg0KV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRVIgPSBFUiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX2xvZ0VSID0gbG9nRVIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfZHJvcF9nZW9tZXRyeShyZW5hbWUoZXJfc2ZQTFssLTRdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVSID0gRVIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyX2xvZ0VSID0gbG9nRVIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9kcm9wX2dlb21ldHJ5KGludW5fc2YpKSAlPiUNCiAgbXV0YXRlKHdldGxhbmRJRCA9IHJvd19udW1iZXIoKSkNCmBgYA0KDQpCYXJwbG90DQoNCmBgYHtyfQ0KYmFyZXJhbGwgPC0gZ2dwbG90KGVyX3NmX0xNVV93aWRlLCANCiAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBmY3RfcmV2KGFzLmZhY3RvcihpbnVuKSksIA0KICAgICAgICAgICAgICAgICAgIHkgPSBsb2dFUiwgZmlsbCA9IGxvZ0VSKSkgKw0KICBnZW9tX2NvbCgpICsgIyB0aGUgZ2VvbV9iYXIgZXF1aXZhbGVudCB3aGVuIGl0J3Mgbm90IGNvdW50aW5nIGNhc2VzLg0KICBnZW9tX2xpbmVyYW5nZShtYXBwaW5nID0gYWVzKHltaW4gPSBsb3dlcl9sb2dFUiwgeW1heCA9IHVwcGVyX2xvZ0VSKSwNCiAgICAgICAgICAgICAgICAgY29sb3IgPSAnZ3JleTUwJywgYWxwaGEgPSAwLjIpICsNCiAgc2NhbGVfZmlsbF9zdGVwc24oY29sb3JzID0gZXJDb250cm9sJGVycGFsLA0KICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBlckNvbnRyb2wkZXJicmVha3NbMjpsZW5ndGgoZXJDb250cm9sJGVyYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKGVyQ29udHJvbCRlcmJyZWFrcyksIG1heChlckNvbnRyb2wkZXJicmVha3MpKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZXJDb250cm9sJGVybGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gZXJsYWJlbCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gZXJDb250cm9sJGVyYnJlYWtzWzI6bGVuZ3RoKGVyQ29udHJvbCRlcmJyZWFrcyldLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcm91bmQoMTBeKGVyQ29udHJvbCRlcmJyZWFrc1syOmxlbmd0aChlckNvbnRyb2wkZXJicmVha3MpXSkpKSArDQogIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gYXMuY2hhcmFjdGVyKHhicmVha3MpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIocm91bmQoeGJyZWFrcykpKSArDQogIGxhYnMoeCA9ICdJbnVuZGF0aW9uIHZvbHVtZSAoTWwgYXQgbWF4IGV4dGVudCknLCB5ID0gZXJsYWJlbCkNCmJhcmVyYWxsDQpgYGANCg0KIyMjIEJvdGggdG9nZXRoZXIsIHdpdGggR1BQIHVwIGFuZCBFUiBkb3duDQoNClNldHVwDQpgYGB7cn0NCiMgQ2FuIEkgbWFrZSBvbmUgd2l0aCB0aGVtIGJvdGggdGhlcmUgZ29pbmcgb3Bwb3NpdGUgZGlyZWN0aW9uPw0KYm90aF9zZl9MTVVfd2lkZSA8LSBiaW5kX2NvbHMobXV0YXRlKGdwcF9zZl9MTVVfd2lkZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0X2Ryb3BfZ2VvbWV0cnkoZXJfc2ZfTE1VX3dpZGVbLC0oNzoxMCldKSkpDQoNCiMgTmVlZCBuZXcgbGFiZWxzIGFuZCBicmVha3MuIENvdWxkIGNvYmJsZSwgYnV0IGdldHRpbmcgY29uZnVzaW5nIGFuZCBtaXNhbGlnbmVkDQojIGJvdGhicmVha3NfbG9nIDwtIGMoLXJldihlcmJyZWFrc19sb2dbMjpsZW5ndGgoZXJicmVha3NfbG9nKV0pLCBncHBicmVha3NfbG9nKQ0KIA0KIyAjIGFuZCB0aG9zZSBicmVha3MgbWlnaHQgbm90IHF1aXRlIHlpZWxkIDEwLCBzbyBtYXhpbWlzZSB0aGUgcGFsZXR0ZSBkaWZmZXJlbmNlcw0KIyBlcnBhbF9sb2cgPC0gc2VxdWVudGlhbF9oY2wobGVuZ3RoKGVyYnJlYWtzX2xvZyktMSwgcGFsZXR0ZSA9ICdQdXJwbGVzJywgcmV2ID0gVFJVRSkNCiMgSSB0aGluayBoZXJlIEkgd2FudCBjb250aW51b3VzIGNvbG9ycy4gYnV0IG1heWJlIHN0aWxsIGEgYnJva2VuIHVwIGxlZ2VuZD8NCg0KIyBoYXZlIHRvIGRvIHRoZSBuZWdhdGl2ZXMgYmVmb3JlIGRlbG9nZ2luZw0KIyBib3RobGFiZWxzX2xvZyA8LSBjKC0xMF5yZXYoZXJicmVha3NfbG9nKSwgMTBeZ3BwYnJlYWtzX2xvZykNCiMgDQojIGJvdGhsYWJlbHNfbG9nIDwtIGZvcm1hdChib3RobGFiZWxzX2xvZywgYmlnLm1hcms9IiwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIyBzY2llbnRpZmljPUZBTFNFLCB0cmltID0gVFJVRSwgZGlnaXRzID0gMCkNCg0KIyBUaGlzIGlzIHJlYWxseSBnZXR0aW5nIGNvbXBsZXguIFdoeSBkb24ndCBJIGp1c3QgdXNlIDAsMSwxMCwxMDAsMTAwMCwxMDAwMD8NCiMgVGhleSd2ZSBib3RoIGJlZW4gc2hpZnRlZCBieSAxIHRvIGxvZywgc28NCiMgVGhpcyBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBsYWJlbHMsIHRoZSBhY3R1YWwgbG9nLXNjYWxlIGlzIHBsb3R0ZWQgYW5kIHNvIHRoZSB6ZXJvcyBhcmUgZG9uZSBjb3JyZWN0bHkNCmJvdGhicmVha3NfbG9nIDwtIGMoLTEwXig0OjApLCAxMF4oMTo0KSkNCmJvdGhicmVha3NfbG9nWzVdIDwtIDAgIyBCZWNhdXNlIGJvdGggd2VyZSBzaGlmdGVkIHNvIDEgPSAwDQpib3RobGFiZWxzX2xvZyA8LSBhcy5jaGFyYWN0ZXIoYm90aGJyZWFrc19sb2cpDQoNCg0KIyBlcnN0YXJ0IDwtIGVybGFiZWxzX2xvZ1sxOihsZW5ndGgoZXJsYWJlbHNfbG9nKS0xKV0NCiMgZXJzdGFydFsxXSA8LSAiMCIgIyBpbnN0ZWFkIG9mIDENCiMgYm90aGxhYmVsc19sb2cgPC0gcGFzdGUwKGVyc3RhcnQsICcgdG8gJywgZXJsYWJlbHNfbG9nWzI6bGVuZ3RoKGVybGFiZWxzX2xvZyldKQ0KIyBlcmxhYmVsc19sb2cNCg0KIyBBQUFBIHRyeSB0byBnZXQgc29tZSBsYWJsZXMgZm9yIHRoZSB4LiBJIEpVU1QgV0FOVCBJVCBUTyBIQVZFIFRIRSBOVU1CRVIgQlVUIElUIFdPTiJUIERPIElUDQpyZW9yZHggPC0gZmN0X3Jlb3JkZXIoYXMuZmFjdG9yKGJvdGhfc2ZfTE1VX3dpZGUkd2V0bGFuZElEKSwgDQogICAgICAgICAgICAgICAgICAgICAgYm90aF9zZl9MTVVfd2lkZSRsb2dHUFAsIC5kZXNjID0gVFJVRSkNCiMgSSdtIGNvbmZ1c2VkLiB0aGF0IGRpZG4ndCB3b3JrLiB0aGlzIGlzIGFub3l1dGluZw0KYGBgDQoNClRyeSBhIHBsb3QNCg0KYGBge3J9DQpiYXJib3RoUSA8LSBnZ3Bsb3QoYm90aF9zZl9MTVVfd2lkZSkgKw0KICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBmY3RfcmV2KGFzLmZhY3RvcihpbnVuKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAtbG9nRVIsIGZpbGwgPSAtbG9nRVIpKSArICMgdGhlIGdlb21fYmFyIGVxdWl2YWxlbnQgd2hlbiBpdCdzIG5vdCBjb3VudGluZyBjYXNlcy4NCiAgZ2VvbV9saW5lcmFuZ2UobWFwcGluZyA9IGFlcyh4ID0gZmN0X3Jldihhcy5mYWN0b3IoaW51bikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAtbG93ZXJfbG9nRVIsIHltYXggPSAtdXBwZXJfbG9nRVIpLA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICdncmV5NTAnLCBhbHBoYSA9IDAuMikgKw0KICAjIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGVycGFsX2xvZywNCiAgIyAgICAgICAgICAgICAgICAgICBicmVha3MgPSBlcmJyZWFrc19sb2dbMjpsZW5ndGgoZXJicmVha3NfbG9nKV0sDQogICMgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oZXJicmVha3NfbG9nKSwgbWF4KGVyYnJlYWtzX2xvZykpLA0KICAjICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGVybGFiZWxzX2xvZywNCiAgIyAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAjICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlcmxhYmVsKSArDQogDQogICMgc2NhbGVfZmlsbF9zdGVwc24oY29sb3JzID0gYyhyZXYoZXJwYWxfbG9nKSwgZ3BwcGFsX2xvZyksDQogICMgICAgICAgICAgICBicmVha3MgPSBjKC1yZXYoZXJicmVha3NfbG9nWzI6bGVuZ3RoKGVyYnJlYWtzX2xvZyldKSwgMCwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgZ3BwYnJlYWtzX2xvZ1syOmxlbmd0aChncHBicmVha3NfbG9nKV0pLA0KICAjICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oLWVyYnJlYWtzX2xvZyksIG1heChncHBicmVha3NfbG9nKSksDQogICMgICAgICAgICAgICAjIGxhYmVscyA9IGMoZXJsYWJlbHNfbG9nLCBncHBsYWJlbHNfbG9nKSwNCiAgIyAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICMgICAgICAgICAgICBuYW1lID0gJ2tnIE8yXG5hdCBtYXggZXh0ZW50JykgKw0KICBnZW9tX2NvbChtYXBwaW5nID0gYWVzKHggPSBmY3RfcmV2KGFzLmZhY3RvcihpbnVuKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2dHUFAsIGZpbGwgPSBsb2dHUFApKSArDQogIGdlb21fbGluZXJhbmdlKG1hcHBpbmcgPSBhZXMoeCA9IGZjdF9yZXYoYXMuZmFjdG9yKGludW4pKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gbG93ZXJfbG9nR1BQLCB5bWF4ID0gdXBwZXJfbG9nR1BQKSwNCiAgICAgICAgICAgICAgICAgY29sb3IgPSAnZ3JleTUwJywgYWxwaGEgPSAwLjIpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IGZjdF9yZXYoYXMuZmFjdG9yKGludW4pKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nR1BQLWxvZ0VSLCBncm91cCA9IE5BKSkgKw0KICANCiAgIyBUaGlzIHBhbGV0dGUgaXMgdmVyeSBzbGlnaHRseSBkaWZmZXJlbnQgYmVjYXVzZSBpdCdzIG5vdCBiaW5uZWQgYW5kIEdQUCBhYm92ZSB1c2VzIEVtZXJhbGQgaW5zdGVhZCBvZiBncmVlbiwgYnV0IGl0J3Mgc3VyZSBjbG9zZSBhbmQgd2F5IGVhc2llcg0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXNfZGl2ZXJnaW5nKHBhbGV0dGUgPSAiUHVycGxlLUdyZWVuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC00LCA0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gLTQ6NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBib3RobGFiZWxzX2xvZykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNCksDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAtNDo0LA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYm90aGxhYmVsc19sb2cpICsNCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtZXJicmVha3NfbG9nWzI6bGVuZ3RoKGVyYnJlYWtzX2xvZyldLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHBicmVha3NfbG9nWzI6bGVuZ3RoKGdwcGJyZWFrc19sb2cpXSksDQogICMgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoLXJvdW5kKDEwXihlcmJyZWFrc19sb2dbMjpsZW5ndGgoZXJicmVha3NfbG9nKV0pKSwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoMTBeKGdwcGJyZWFrc19sb2dbMjpsZW5ndGgoZ3BwYnJlYWtzX2xvZyldKSkpKSArDQogIGxhYnMoeCA9ICdJbnVuZGF0aW9uIHZvbHVtZSAoTWwgYXQgbWF4IGV4dGVudCknLCB5ID0gJ2tnIE8yJywgZmlsbCA9ICdrZyBPMicpICsNCiAgIyBhcmdoIGRvZXNuJ3Qgd29yayBiZWNhdXNlIGhhcyBiZWVuIHJlb3JkZXJlZA0KICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGFzLmNoYXJhY3Rlcih4YnJlYWtzKSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKHJvdW5kKHhicmVha3MpKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSA4KSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43NSwgMC41MyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQ0KYmFyYm90aFENCmBgYA0KDQpUaGUgcmFua2VkIHggbWlnaHQgbWFrZSBtb3JlIHNlbnNlPyBFYXNpZXIgdG8gcmVhZCwgYW55d2F5Lg0KDQpgYGB7cn0NCmJvdGhfc2ZfTE1VX3dpZGUyIDwtIGJvdGhfc2ZfTE1VX3dpZGUgJT4lIA0KICBhcnJhbmdlKGRlc2MoaW51bikpICU+JSANCiAgbXV0YXRlKGludW5yYW5rID0gcm93X251bWJlcigpKQ0KYGBgDQoNCk1ha2UgdGhlIHBsb3QuIEludGVyZXN0aW5nIHRoYXQgdGhlIG5vdGVib29rIHBsb3R0ZXIgZG9lcyBhIHdvcnNlIGpvYiB0aGFuIHRoZSBwbG90cyBwYW5lbCBmb3IgYSBzY3JpcHQuIFRoZSBmdW5ueSBnYXBzIGFyZW4ndCByZWFsbHkgdGhlcmUtIHRvIHNlZSwgcnVuIGJhcmJvdGggaW4gdGhlIGNvbnNvbGUuDQoNCmBgYHtyfQ0KYmFyYm90aCA8LSBnZ3Bsb3QoYm90aF9zZl9MTVVfd2lkZTIpICsNCiAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gaW51bnJhbmssIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAtbG9nRVIsIGZpbGwgPSAtbG9nRVIpKSArICMgdGhlIGdlb21fYmFyIGVxdWl2YWxlbnQgd2hlbiBpdCdzIG5vdCBjb3VudGluZyBjYXNlcy4NCiAgZ2VvbV9saW5lcmFuZ2UobWFwcGluZyA9IGFlcyh4ID0gaW51bnJhbmssDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IC1sb3dlcl9sb2dFUiwgeW1heCA9IC11cHBlcl9sb2dFUiksDQogICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyZXk1MCcsIGFscGhhID0gMC4yKSArDQoNCmdlb21fY29sKG1hcHBpbmcgPSBhZXMoeCA9IGludW5yYW5rLCANCiAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxvZ0dQUCwgZmlsbCA9IGxvZ0dQUCkpICsNCiAgZ2VvbV9saW5lcmFuZ2UobWFwcGluZyA9IGFlcyh4ID0gaW51bnJhbmssDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IGxvd2VyX2xvZ0dQUCwgeW1heCA9IHVwcGVyX2xvZ0dQUCksDQogICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyZXk1MCcsIGFscGhhID0gMC4yKSArDQogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBpbnVucmFuaywgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2dHUFAtbG9nRVIsIGdyb3VwID0gTkEpKSArDQogIA0KICAjIFRoaXMgcGFsZXR0ZSBpcyB2ZXJ5IHNsaWdodGx5IGRpZmZlcmVudCBiZWNhdXNlIGl0J3Mgbm90IGJpbm5lZCBhbmQgR1BQIGFib3ZlIHVzZXMgRW1lcmFsZCBpbnN0ZWFkIG9mIGdyZWVuLCBidXQgaXQncyBzdXJlIGNsb3NlIGFuZCB3YXkgZWFzaWVyDQogIHNjYWxlX2ZpbGxfY29udGludW91c19kaXZlcmdpbmcocGFsZXR0ZSA9ICJQdXJwbGUtR3JlZW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTQsIDQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAtNDo0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGJvdGhsYWJlbHNfbG9nKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC00LCA0KSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IC00OjQsDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBib3RobGFiZWxzX2xvZykgKw0KICBsYWJzKHggPSAnUmFua2VkIGludW5kYXRpb24nLCB5ID0gJ2tnIE8yJywgZmlsbCA9ICdrZyBPMicpICsNCiAgIyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGMoMSwgMjUwLCA1MDAsIDc1MCwgMTAwMCkpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gOCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDAuNzUsIDAuNTMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkNCmJhcmJvdGgNCmBgYA0KDQpTYXZlIHRob3NlIGFzIGZpZ3VyZXMNCg0KYGBge3J9DQoNCnBkZihmaWxlLnBhdGgoc2NyaXB0T3V0LCAnV2VyYWlfbWlycm9yZ3JhbVEucGRmJyksIA0KICAgIG9uZWZpbGUgPSBGQUxTRSwgaGVpZ2h0ID0gMTIvMi41NCwgd2lkdGggPSAxNi8yLjU0LCB1c2VEaW5nYmF0cyA9IEZBTFNFKQ0KcHJpbnQoYmFyYm90aFEpDQpkZXYub2ZmKCkNCg0KcG5nKGZpbGUucGF0aChzY3JpcHRPdXQsICdXZXJhaV9taXJyb3JncmFtUS5wbmcnKSwgDQogICAgaGVpZ2h0ID0gMTIvMi41NCwgd2lkdGggPSAxNi8yLjU0LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkNCnByaW50KGJhcmJvdGhRKQ0KZGV2Lm9mZigpDQoNCg0KcGRmKGZpbGUucGF0aChzY3JpcHRPdXQsICdXZXJhaV9taXJyb3JncmFtLnBkZicpLCANCiAgICBvbmVmaWxlID0gRkFMU0UsIGhlaWdodCA9IDgvMi41NCwgd2lkdGggPSAxMi8yLjU0LCB1c2VEaW5nYmF0cyA9IEZBTFNFKQ0KcHJpbnQoYmFyYm90aCkNCmRldi5vZmYoKQ0KDQpwbmcoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ1dlcmFpX21pcnJvcmdyYW0ucG5nJyksIA0KICAgIGhlaWdodCA9IDgvMi41NCwgd2lkdGggPSAxMi8yLjU0LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkNCnByaW50KGJhcmJvdGgpDQpkZXYub2ZmKCkNCmBgYA0KDQoNCldoYXQgYWJvdXQgRGFycmVuJ3MgZmluZ2VycHJpbnRzPyBUaGV5IHdvdWxkIG1heWJlIHRha2UgdGhlIEdQUCBhbmQgRVIgYW5kDQptYWtlIGEgZGVuc2l0eSB3aXRoIHRoZW0/IE9VdCBvZiB3aGF0PyBUaGUgd2V0bGFuZHM/IENvdWxkIHdvcmsuIFdvdWxkIG5lZWQgdG8NCnNvcnQgb3V0IHRoZSB3ZWlnaHRpbmcgYnkgdm9sdW1lLiBpdCdzIGFscmVhZHkgaW4gdGhlcmUsIGJ1dCB0aGF0IG1lYW5zIGl0DQp3aWxsIGdpdmUgZWFjaCBsb2NhdGlvbiB0aGUgc2FtZSB3ZWlnaHQuIEkgdGhpbmsgYSBiZXR0ZXIgdGhpbmcgZm9yIHRoZQ0KZmluZ2VycHJpbnRzIHdvdWxkIGJlIHRvIHJlbW92ZSBpdCwgYW5kIHRoZW4gZ2l2ZSBlYWNoIHdldGxhbmQgaXRzIHByZWRpY3RlZA0KcGVyIGxpdGVyIHJhdGUgYW5kIHdlaWdodCBieSB2b2x1bWUgSUUgdXNlIHRoZSBzdHJhaWdodCBwcmVkaWN0aW9ucyBhbmQgdGhlbg0Kd2VpZ2h0IGJ5IGludW5kYXRvbiBTaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkLCBidXQgbGlrZWx5IHdvbid0IGJlIA0KDQpXb3VsZCBiZSBhIHJlYWxseSBjb29sIHdheSB0byBsb29rIGF0IHNjZW5hcmlvcy4gZXNwZWNpYWxseSBpZiBJIGNhbiBkbyBpdA0KZm9yIHdob2xlIGNhdGNobWVudHMNCg0KQlVULCBiZWNhdXNlIEdQUCBhbmQgRVIgYXJlIGJvdGggbGluZWFyIGZpdHMgb2YgdGVtcCwgdGhleSB3aWxsIGV4YWN0bHkNCnByZWRpY3QgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gYSBsaW5lYXIgcmVsYXRpb25zaGlwLCBhbmQgc28gdGhlcmUgd29uJ3QgYmUNCmFueSAyLWQgdmFyaWF0aW9uIGFuZCBhbGwgdGhlIHBvaW50cyB3aWxsIGZhbGwgb24gYSBsaW5lLiBJRSBmb3IgYSBnaXZlbiBHUFANCnRoZXJlIHdpbGwgb25seSBiZSBvbmUgRVIsIGFuZCBzbyB0aGUgZmluZ2VycHJpbnQgd2lsbCBiZSBhIGxpbmUuIENvb2wgaWRlYSwNCmJ1dCB3ZSdkIG5lZWQgbW9yZSBpbmZvIGFib3V0IHRoZWlyIHZhcmlhbmNlIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXINCg0KIyMgQW5udWFsIHJlcG9ydGluZw0KDQpXaGF0IGFib3V0IG1ha2luZyBzb21lIGV4YW1wbGVzIHRvIGlsbHVzdHJhdGUgYW5udWFsIChvciBhcmJpdHJhcnkgdGltZSBwZXJpb2QpIHJlcG9ydGluZz8NCg0KRmlyc3QsIGVzdGFibGlzaCB0aGUgdGltZSBwZXJpb2RzIGFuZCBkbyB0aGUgYWdncmVnYXRpb25zIGFuZCBvdGhlciBkYXRhIG9yZ2FuaXNhdGlvbi4NCg0KVVNFIE1BWCBBQ1JPU1MgVElNRSBGT1IgVEhFIEJJTU9OVEhMWSBNQVggRVhURU5UUy0gVEhBVCBHSVZFUyBBIFlFQVJMWSBNQVggU0lOQ0UgVEhFIE1FQU4gSVMgTUVBTklOR0xFU1MNCg0KVGhpcyBpcyBhbGwgZG9uZSBpbiB0aGUgbWV0YWJQbG90U2V0dXBfTG9jYWwuDQoNCmBgYHtyfQ0KDQojIEkgVEhJTksgSSBTSE9VTEQgQkUgQUJMRSBUTyBTS0lQIFRISVMgYW5kIHVzZSB0aGUgZnVuY3Rpb25zLiBCVVQgbm90IHRpbWUgcmlnaHQgbm93IHRvIHN3aXRjaA0KIyBHUFANCmdwcFllYXJfc2YgPC0gZ3BwYW5udWFsICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gLWdlb21ldHJ5LCBuYW1lc190byA9ICdXYXRlclllYXInLCB2YWx1ZXNfdG8gPSAnR1BQJykgJT4lDQogIG11dGF0ZShsb2dHUFAgPSAgbG9nMTAoMStHUFApKSAlPiUNCiAgc3RfYXNfc2YoKSAjIFJFQUxMWT8/Pw0KZ3BwWWVhcl9zZg0KDQptYXgoZ3BwWWVhcl9zZiRsb2dHUFApICMgaXMgd2l0aGluIA0KZ3BwQ29udHJvbCRncHBicmVha3MNCg0KIyBFUg0KZXJZZWFyX3NmIDwtIGVyYW5udWFsICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gLWdlb21ldHJ5LCBuYW1lc190byA9ICdXYXRlclllYXInLCB2YWx1ZXNfdG8gPSAnRVInKSAlPiUNCiAgbXV0YXRlKGxvZ0VSID0gIGxvZzEwKDErRVIpKSAlPiUNCiAgc3RfYXNfc2YoKSAjIFJFQUxMWT8/Pw0KZXJZZWFyX3NmDQoNCiMgdGhlIHJhbmdlIHNob3VsZCBzdGlsbCB3b3JrIGZvciB0dGhlIGNvbG9ycw0KbWF4KGVyWWVhcl9zZiRsb2dFUikgIyBpcyB3aXRoaW4gDQplckNvbnRyb2wkZXJicmVha3MNCg0KIyBUZW1wDQp0ZW1wWWVhcl9zZiA8LSB0ZW1wYW5udWFsICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gLWdlb21ldHJ5LCBuYW1lc190byA9ICdXYXRlclllYXInLCB2YWx1ZXNfdG8gPSBuYW1lcyh0ZW1wYW5udWFsKSkgJT4lDQogIHN0X2FzX3NmKCkgIyBSRUFMTFk/Pz8NCg0KDQojIEludW5kYXRpb24NCmludW5ZZWFyX3NmIDwtIGludW5hbm51YWwgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtZ2VvbWV0cnksIG5hbWVzX3RvID0gJ1dhdGVyWWVhcicsIHZhbHVlc190byA9IG5hbWVzKGludW5hbm51YWwpKSAlPiUNCiAgbXV0YXRlKGxvZ0ludW4gPSAgbG9nMTAoMSt2b2x1bWVNTCkpICU+JQ0KICBzdF9hc19zZigpICMgUkVBTExZPz8/DQoNCmBgYA0KDQpJIGRvbid0IHRoaW5rIEkgdXNlIHRoaXMsIGJ1dCBJIGRpZCBtYWtlIGEgZnVsbC13ZXJhaSBhZ2dyZWdhdGlvbi4gU1VNIGFjcm9zcyBzcGFjZSBpcyBmaW5lLg0KDQpgYGB7cn0NCiMgYWdncmVnYXRlIHRvIHdlcmFpDQojIHRlbXAgYXJlYS13ZWlnaHRlZA0KYXJlYXMgPC0gdGVtcGFubnVhbCAlPiUNCiAgc3RfZ2VvbWV0cnkoKSAlPiUNCiAgc3RfYXJlYSgpICU+JQ0KICBhcy5udW1lcmljKCkNCnRlbXBXIDwtIGNhdGNoQWdnIDwtIGNhdGNoQWdnVyhzdHJpY3QgPSB0ZW1wYW5udWFsLCBzdHJpY3RXZWlnaHRzID0gYXJlYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gbWVhbiwgc3VtbWFyeVBvbHkgPSByYW1zYXJXMSkNCiAgIyBzdW0gYWNyb3NzIHNwYWNlDQppbnVuVyA8LSBhZ2dyZWdhdGUoaW51bmFubnVhbCwgDQogICAgICAgICAgICAgICAgICAgICAgYnkgPSByYW1zYXJXMSwgDQogICAgICAgICAgICAgICAgICAgICAgRlVOID0gc3VtLCBuYS5ybSA9IFRSVUUpDQoNCmdwcFcgPC0gYWdncmVnYXRlKGdwcGFubnVhbCwgDQogICAgICAgICAgICAgICAgICAgYnkgPSByYW1zYXJXMSwgDQogICAgICAgICAgICAgICAgICAgRlVOID0gc3VtLCBuYS5ybSA9IFRSVUUpDQplclcgPC0gYWdncmVnYXRlKGVyYW5udWFsLCANCiAgICAgICAgICAgICAgICAgICBieSA9IHJhbXNhclcxLCANCiAgICAgICAgICAgICAgICAgICBGVU4gPSBzdW0sIG5hLnJtID0gVFJVRSkNCg0KYGBgDQoNCiMjIyBUbWFwIFBsb3RzDQpNYWtlIGEgZmFjZXR0ZWQgdG1hcA0KDQpBZ2FpbiwgY2FuIEkgZG8gdGhpcyBieSBtb2RpZnlpbmcgd2hhdCBJIHBhc3MgdG8gdGhlIHBsb3R0aW5nIGZ1bmN0aW9ucz8gQWxtb3N0IGNlcnRhaW5seQ0KDQpUaGUgdW5pdHMgYXJlIHdlaXJkLCBiZWNhdXNlIHRoaXMgaXMgYWRkZWQgdXAgYWNyb3NzIGJpbW9udGhzLiBJdCdzIG5laXRoZXIgdGhlIHRvdGFsIG9yIHRoZSBhdmVyYWdlLk5vdCByZWFsbHkgc3VyZSB3aGF0IHRvIGNhbGwgaXQNCg0KQ2hhbmdlIHRoZSB0bWFwX21vZGUoKSBkZXBlbmRpbmcgb24gdGhlIHB1cnBvc2UuIERPIE5PVCBDSEFOR0UgVE8gVklFVyBBTkQgVFJZIFRPIFJVTiBIRVJFLiBJRiBZT1UgV0FOVCBUTyBWSUVXLCBDSEFOR0UgQU5EIFJVTiBJTiBDT05TT0xFLiBUaGUgbWFya2Rvd24gd2lsbCBydW4gaXQsIGJ1dCBpbmNyZWRpYmx5IHNsb3dseS4NCg0KIyMjIyBHUFANCg0KYGBge3J9DQp0bWFwX21vZGUoJ3Bsb3QnKQ0KDQpncHB5cmxhYmVsIDwtICdZZWFybHkgR1BQIG1heGltdW1cbihrZyAwMiknDQoNCiAgZ3BwQW5udWFsX3RtIDwtIGdwcFllYXJfc2YgJT4lDQogICAgZmlsdGVyKFdhdGVyWWVhciAhPSAnMjAxNC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgICB0bV9zaGFwZSgpICsNCiAgICB0bV9maWxsKGNvbCA9ICdsb2dHUFAnLA0KICAgICAgICAgICAgcGFsZXR0ZSA9IGdwcENvbnRyb2wkZ3BwcGFsLA0KICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3MsDQogICAgICAgICAgICBsYWJlbHMgPSBncHBDb250cm9sJGdwcGxhYmVscywNCiAgICAgICAgICAgIHRpdGxlID0gZ3BweXJsYWJlbCkgKyANCiAgICB0bV9mYWNldHMoYnkgPSAnV2F0ZXJZZWFyJykNCiAgZ3BwQW5udWFsX3RtDQpgYGANCg0KIyMjIyBFUg0KDQpgYGB7cn0NCmVyeXJsYWJlbCA8LSAnWWVhcmx5IEVSIG1heGltdW1cbihrZyAwMiknDQogIA0KICBlckFubnVhbF90bSA8LSBlclllYXJfc2YgJT4lDQogICAgZmlsdGVyKFdhdGVyWWVhciAhPSAnMjAxNC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgICB0bV9zaGFwZSgpICsNCiAgICB0bV9maWxsKGNvbCA9ICdsb2dFUicsDQogICAgICAgICAgICBwYWxldHRlID0gZXJDb250cm9sJGVycGFsLA0KICAgICAgICAgICAgYnJlYWtzID0gZXJDb250cm9sJGVyYnJlYWtzLA0KICAgICAgICAgICAgbGFiZWxzID0gZXJDb250cm9sJGVybGFiZWxzLA0KICAgICAgICAgICAgdGl0bGUgPSBlcnlybGFiZWwpICsgDQogICAgdG1fZmFjZXRzKGJ5ID0gJ1dhdGVyWWVhcicpDQogIGVyQW5udWFsX3RtDQpgYGANCg0KDQojIyMgR0dQTE9UDQoNCiMjIyMgZ3BwDQoNCmBgYHtyfQ0KZ3BwQW5udWFsX2dnIDwtIGdwcFllYXJfc2YgJT4lDQogICAgZmlsdGVyKFdhdGVyWWVhciAhPSAnMjAxNC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihtYXBwaW5nID0gYWVzKGZpbGwgPSBsb2dHUFApLCBjb2xvciA9IE5BKSArDQogICAgY29vcmRfc2YoKSArDQogICAgIyBDbG9zZXN0IHRvIHRoZSB0bWFwDQogICAgc2NhbGVfZmlsbF9zdGVwc24oY29sb3JzID0gZ3BwQ29udHJvbCRncHBwYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihncHBDb250cm9sJGdwcGJyZWFrcyksIG1heChncHBDb250cm9sJGdwcGJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdwcENvbnRyb2wkZ3BwbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdwcHlybGFiZWwpICsNCiAgICBmYWNldF93cmFwKHZhcnMoV2F0ZXJZZWFyKSkNCiAgZ3BwQW5udWFsX2dnDQpgYGANCg0KIyMjIyBFUg0KDQpgYGB7cn0NCmVyQW5udWFsX2dnIDwtIGVyWWVhcl9zZiAlPiUNCiAgICBmaWx0ZXIoV2F0ZXJZZWFyICE9ICcyMDE0LTA2LTI5JykgJT4lICMgYmVjYXVzZSBhIDUtcGFuZWwgaXMgdWdseQ0KICAgIGdncGxvdCgpICsNCiAgICBnZW9tX3NmKG1hcHBpbmcgPSBhZXMoZmlsbCA9IGxvZ0VSKSwgY29sb3IgPSBOQSkgKw0KICAgIGNvb3JkX3NmKCkgKw0KICAgICMgQ2xvc2VzdCB0byB0aGUgdG1hcA0KICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGVyQ29udHJvbCRlcnBhbCwNCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBlckNvbnRyb2wkZXJicmVha3NbMjpsZW5ndGgoZXJDb250cm9sJGVyYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oZXJDb250cm9sJGVyYnJlYWtzKSwgbWF4KGVyQ29udHJvbCRlcmJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGVyQ29udHJvbCRlcmxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlcnlybGFiZWwpICsNCiAgICBmYWNldF93cmFwKHZhcnMoV2F0ZXJZZWFyKSkNCiAgZXJBbm51YWxfZ2cNCmBgYA0KDQpXaGF0IGRvIHRoZSBkcml2ZXJzIGxvb2sgbGlrZSBmb3IgdGhvc2UgeWVhcnM/DQoNCiMjIyMgVGVtcA0KDQpgYGB7cn0NCnRlbXB5cmxhYmVsIDwtICdZZWFybHkgbWVhblxudGVtcCAoQyknDQoNCnRlbXBDb250cm9sIDwtIHRlbXBzZXR1cChkYXRhID0gd2VyYWlDcm9wVGVtcCwgYXR0bnVtID0gMSkNCnRlbXBBbm51YWxfZ2cgPC0gdGVtcFllYXJfc2YgJT4lDQogICAgZmlsdGVyKFdhdGVyWWVhciAhPSAnMjAxNC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihtYXBwaW5nID0gYWVzKGZpbGwgPSBiaW1vbnRoX3RlbXBDKSwgY29sb3IgPSBOQSkgKw0KICAgIGNvb3JkX3NmKCkgKw0KICAgICMgQ2xvc2VzdCB0byB0aGUgdG1hcA0KICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IHRlbXBDb250cm9sJHRlbXBwYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gdGVtcENvbnRyb2wkdGVtcGJyZWFrc1syOmxlbmd0aCh0ZW1wQ29udHJvbCR0ZW1wYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4odGVtcENvbnRyb2wkdGVtcGJyZWFrcyksIG1heCh0ZW1wQ29udHJvbCR0ZW1wYnJlYWtzKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gdGVtcENvbnRyb2wkdGVtcGxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0ZW1weXJsYWJlbCkgKw0KICAgIGZhY2V0X3dyYXAodmFycyhXYXRlclllYXIpKQ0KIHRlbXBBbm51YWxfZ2cNCmBgYA0KDQojIyMjIEludW5kYXRpb24NCg0KYGBge3J9DQppbnVueXJsYWJlbCA8LSAnWWVhcmx5IGludW5kYXRpb25cbm1heGltdW0gKE1MKScNCg0KaW51bkNvbnRyb2wgPC0gaW51bnNldHVwKGRhdGEgPSB3ZXJhaUNyb3BJbnVuLCBhdHRudW0gPSAxKQ0KaW51bkFubnVhbF9nZyA8LSBpbnVuWWVhcl9zZiAlPiUNCiAgICBmaWx0ZXIoV2F0ZXJZZWFyICE9ICcyMDE0LTA2LTI5JykgJT4lICMgYmVjYXVzZSBhIDUtcGFuZWwgaXMgdWdseQ0KICAgIGdncGxvdCgpICsNCiAgICBnZW9tX3NmKG1hcHBpbmcgPSBhZXMoZmlsbCA9IHZvbHVtZU1MKSwgY29sb3IgPSBOQSkgKw0KICAgIGNvb3JkX3NmKCkgKw0KICAgICMgQ2xvc2VzdCB0byB0aGUgdG1hcA0KICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGludW5Db250cm9sJGludW5wYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gaW51bkNvbnRyb2wkaW51bmJyZWFrc1syOmxlbmd0aChpbnVuQ29udHJvbCRpbnVuYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4oaW51bkNvbnRyb2wkaW51bmJyZWFrcyksIG1heChpbnVuQ29udHJvbCRpbnVuYnJlYWtzKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gaW51bkNvbnRyb2wkaW51bmxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbnVueXJsYWJlbCkgKw0KICAgIGZhY2V0X3dyYXAodmFycyhXYXRlclllYXIpKQ0KIGludW5Bbm51YWxfZ2cNCmBgYA0KDQpTdGFjayAzIHllYXJzIG9mIGdwcCBhbmQgRVIgdG9nZXRoZXIgZm9yIHRoZSBkb2N1bWVudA0KDQpgYGB7cn0NCmdwcEFubnVhbF9nZzMgPC0gZ3BwWWVhcl9zZiAlPiUNCiAgICBmaWx0ZXIoV2F0ZXJZZWFyICE9ICcyMDE0LTA2LTI5JyAmIFdhdGVyWWVhciAhPSAnMjAxOC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgbXV0YXRlKFdhdGVyWWVhciA9IHN0cl9yZW1vdmUoV2F0ZXJZZWFyLCAnLTA2LTI5JykpICU+JSAjIGJlY2F1c2UgdGhlc2UgYXJlIHdhdGVyIHllYXJzLCBkb24ndCBjbHV0dGVyIHVwIHdpdCBtb250aHMNCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihtYXBwaW5nID0gYWVzKGZpbGwgPSBsb2dHUFApLCBjb2xvciA9IE5BKSArDQogICAgY29vcmRfc2YoKSArDQogICAgIyBDbG9zZXN0IHRvIHRoZSB0bWFwDQogICAgc2NhbGVfZmlsbF9zdGVwc24oY29sb3JzID0gZ3BwQ29udHJvbCRncHBwYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZ3BwQ29udHJvbCRncHBicmVha3NbMjpsZW5ndGgoZ3BwQ29udHJvbCRncHBicmVha3MpXSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihncHBDb250cm9sJGdwcGJyZWFrcyksIG1heChncHBDb250cm9sJGdwcGJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdwcENvbnRyb2wkZ3BwbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gJ2xlZ2VuZCcsDQogICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdwcHlybGFiZWwpICsNCiAgICBmYWNldF9ncmlkKFdhdGVyWWVhcn4uKSArIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KICAjIGdwcEFubnVhbF9nZzMgDQogIA0KICBlckFubnVhbF9nZzMgPC0gZXJZZWFyX3NmICU+JQ0KICAgIGZpbHRlcihXYXRlclllYXIgIT0gJzIwMTQtMDYtMjknICYgV2F0ZXJZZWFyICE9ICcyMDE4LTA2LTI5JykgJT4lICMgYmVjYXVzZSBhIDUtcGFuZWwgaXMgdWdseQ0KICAgICAgbXV0YXRlKFdhdGVyWWVhciA9IHN0cl9yZW1vdmUoV2F0ZXJZZWFyLCAnLTA2LTI5JykpICU+JSAjIGJlY2F1c2UgdGhlc2UgYXJlIHdhdGVyIHllYXJzLCBkb24ndCBjbHV0dGVyIHVwIHdpdCBtb250aHMNCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihtYXBwaW5nID0gYWVzKGZpbGwgPSBsb2dFUiksIGNvbG9yID0gTkEpICsNCiAgICBjb29yZF9zZigpICsNCiAgICAjIENsb3Nlc3QgdG8gdGhlIHRtYXANCiAgICBzY2FsZV9maWxsX3N0ZXBzbihjb2xvcnMgPSBlckNvbnRyb2wkZXJwYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZXJDb250cm9sJGVyYnJlYWtzWzI6bGVuZ3RoKGVyQ29udHJvbCRlcmJyZWFrcyldLA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKGVyQ29udHJvbCRlcmJyZWFrcyksIG1heChlckNvbnRyb2wkZXJicmVha3MpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBlckNvbnRyb2wkZXJsYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAnbGVnZW5kJywNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZXJ5cmxhYmVsKSArDQogICAgZmFjZXRfZ3JpZChXYXRlclllYXJ+LikgKyANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykNCiAgIyBlckFubnVhbF9nZzMNCg0KICBhbm51YWxHUFBFUiA8LSBnZ3B1YnI6OmdnYXJyYW5nZShncHBBbm51YWxfZ2czICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAndG9wJykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSksIA0KICAgICAgICAgICAgICAgICAgICBlckFubnVhbF9nZzMgKyANCiAgICAgICAgICAgICAgICAgICAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICd0b3AnKSkgKw0KICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKSwNCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxKQ0KICBhbm51YWxHUFBFUg0KYGBgDQoNClByaW50IG91dCB0aGUgZ2dwbG90cyBmb3IgdGhlIGRvYw0KDQpgYGB7cn0NCiAjIEp1c3QgcHJpbnQgdGhlIGdncGxvdHMNCiAgIyBDYW4gSSBwcmludCB0aG9zZT8NCiAgcGRmKGZpbGUucGF0aChzY3JpcHRPdXQsICdXZXJhaV9nZ19Bbm51YWwucGRmJyksIA0KICAgICAgb25lZmlsZSA9IEZBTFNFLCBoZWlnaHQgPSAxMi8yLjU0LCB3aWR0aCA9IDE2LzIuNTQsIHVzZURpbmdiYXRzID0gRkFMU0UpDQogIHByaW50KGFubnVhbEdQUEVSKQ0KICBkZXYub2ZmKCkNCiAgDQogIHBuZyhmaWxlLnBhdGgoc2NyaXB0T3V0LCAnV2VyYWlfZ2dfQW5udWFsLnBuZycpLCANCiAgICAgIGhlaWdodCA9IDEyLzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApDQogIHByaW50KGFubnVhbEdQUEVSKQ0KICBkZXYub2ZmKCkNCiAgDQoNCmBgYA0KDQpTYW1lLCBidXQgZm9yIHRoZSBkcml2ZXJzICh0byBnbyBpbiBhcHBlbmRpeCwgcHJvYmFibHkpDQoNCg0KYGBge3J9DQp0ZW1wQW5udWFsX2dnMyA8LSB0ZW1wWWVhcl9zZiAlPiUNCiAgICBmaWx0ZXIoV2F0ZXJZZWFyICE9ICcyMDE0LTA2LTI5JyAmIFdhdGVyWWVhciAhPSAnMjAxOC0wNi0yOScpICU+JSAjIGJlY2F1c2UgYSA1LXBhbmVsIGlzIHVnbHkNCiAgbXV0YXRlKFdhdGVyWWVhciA9IHN0cl9yZW1vdmUoV2F0ZXJZZWFyLCAnLTA2LTI5JykpICU+JSAjIGJlY2F1c2UgdGhlc2UgYXJlIHdhdGVyIHllYXJzLCBkb24ndCBjbHV0dGVyIHVwIHdpdCBtb250aHMNCiAgICBnZ3Bsb3QoKSArDQogICAgZ2VvbV9zZihtYXBwaW5nID0gYWVzKGZpbGwgPSBiaW1vbnRoX3RlbXBDKSwgY29sb3IgPSBOQSkgKw0KICAgIGNvb3JkX3NmKCkgKw0KICAgICMgQ2xvc2VzdCB0byB0aGUgdG1hcA0KICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IHRlbXBDb250cm9sJHRlbXBwYWwsDQogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gdGVtcENvbnRyb2wkdGVtcGJyZWFrc1syOmxlbmd0aCh0ZW1wQ29udHJvbCR0ZW1wYnJlYWtzKV0sDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4odGVtcENvbnRyb2wkdGVtcGJyZWFrcyksIG1heCh0ZW1wQ29udHJvbCR0ZW1wYnJlYWtzKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gdGVtcENvbnRyb2wkdGVtcGxhYmVscywNCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9ICdsZWdlbmQnLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0ZW1weXJsYWJlbCkgKw0KICAgIGZhY2V0X2dyaWQoV2F0ZXJZZWFyfi4pICsgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpDQoNCiAgaW51bkFubnVhbF9nZzMgPC0gaW51blllYXJfc2YgJT4lDQogICAgZmlsdGVyKFdhdGVyWWVhciAhPSAnMjAxNC0wNi0yOScgJiBXYXRlclllYXIgIT0gJzIwMTgtMDYtMjknKSAlPiUgIyBiZWNhdXNlIGEgNS1wYW5lbCBpcyB1Z2x5DQogIG11dGF0ZShXYXRlclllYXIgPSBzdHJfcmVtb3ZlKFdhdGVyWWVhciwgJy0wNi0yOScpKSAlPiUgIyBiZWNhdXNlIHRoZXNlIGFyZSB3YXRlciB5ZWFycywgZG9uJ3QgY2x1dHRlciB1cCB3aXQgbW9udGhzDQogICAgZ2dwbG90KCkgKw0KICAgIGdlb21fc2YobWFwcGluZyA9IGFlcyhmaWxsID0gbG9nSW51biksIGNvbG9yID0gTkEpICsNCiAgICBjb29yZF9zZigpICsNCiAgICAjIENsb3Nlc3QgdG8gdGhlIHRtYXANCiAgICBzY2FsZV9maWxsX3N0ZXBzbihjb2xvcnMgPSBpbnVuQ29udHJvbCRpbnVucGFsLA0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGludW5Db250cm9sJGludW5icmVha3NbMjpsZW5ndGgoaW51bkNvbnRyb2wkaW51bmJyZWFrcyldLA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKGludW5Db250cm9sJGludW5icmVha3MpLCBtYXgoaW51bkNvbnRyb2wkaW51bmJyZWFrcykpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGludW5Db250cm9sJGludW5sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSAnbGVnZW5kJywNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW51bnlybGFiZWwpICsNCiAgICBmYWNldF9ncmlkKFdhdGVyWWVhcn4uKSArIA0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQ0KICANCiAgDQogIGFubnVhbFRJIDwtIGdncHVicjo6Z2dhcnJhbmdlKHRlbXBBbm51YWxfZ2czICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAndG9wJykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSksIA0KICAgICAgICAgICAgICAgICAgICBpbnVuQW5udWFsX2dnMyArIA0KICAgICAgICAgICAgICAgICAgICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcpKSArDQogICAgICAgICAgICAgICAgICAgICAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpLA0KICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEpDQogIGFubnVhbFRJDQpgYGANCg0KUHJpbnQgb3V0IHRoZSBnZ3Bsb3RzIGZvciB0aGUgZG9jDQoNCmBgYHtyfQ0KICMgSnVzdCBwcmludCB0aGUgZ2dwbG90cw0KICAjIENhbiBJIHByaW50IHRob3NlPw0KICBwZGYoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ1dlcmFpX2dnX0FubnVhbF9EUklWRVJTLnBkZicpLCANCiAgICAgIG9uZWZpbGUgPSBGQUxTRSwgaGVpZ2h0ID0gMTIvMi41NCwgd2lkdGggPSAxNi8yLjU0LCB1c2VEaW5nYmF0cyA9IEZBTFNFKQ0KICBwcmludChhbm51YWxUSSkNCiAgZGV2Lm9mZigpDQogIA0KICBwbmcoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ1dlcmFpX2dnX0FubnVhbF9EUklWRVJTLnBuZycpLCANCiAgICAgIGhlaWdodCA9IDEyLzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApDQogIHByaW50KGFubnVhbFRJKQ0KICBkZXYub2ZmKCkNCiAgDQoNCmBgYA0KDQoNCiMjIFNjZW5hcmlvcw0KV2FudCB0byBiYXNlIHRoaXMgcHJldHR5IGNsb3NlbHkgb24gdGhlIGJhc2luLXNjYWxlIHNjZW5hcmlvcy4gQnV0IGl0IHdvdWxkIGJlIG5pY2UgaWYgSSBjYW1lIHVwIHdpdGggc29tZSBwbG90cyB0aGF0IGFjdHVhbGx5IG1lYXN1cmUgdGhlIGNoYW5nZSwgdG9vLiBNYXliZSBqdXN0IGNoYW5nZSBmcm9tIGJhc2VsaW5lPyBpZSBzY2VuZSB4IC0gYmFzZWxpbmU/IE9uIGFic29sdXRlIG9yIHJlbGF0aXZlIHNjYWxlPyBhcyBtYXBzPyBBcyBiYXJwbG90cyB3aXRoIGJhc2VsaW5lIEAgMD8NCg0KTWFrZSBhbGwgdGhlIHBsb3RzLiBBaCwgYnV0IHRoZSBiYXNpbi1zY2FsZSAod2hlcmUgdGhpcyBpcyBzb3J0ZWQgb3V0KSB1c2VzIGFubnVhbCBzdGFycyBjcmVhdGVkIGluIHRoZSBzZXR1cCBmaWxlLCB3aGlsZSBoZXJlIEkndmUgdXNlZCB4eHhZZWFyX3NmIGNyZWF0ZWQgaW4gdGhpcyBybWQuVGhlIHdheSBJIGRvIGl0IGZvciB0aGUgYmFzaW4gaXMgYmV0dGVyLCBidXQgZG8gSSBoYXZlIHRoZSBtZW1vcnkgdG8gZG8gaXQgdGhhdCB3YXkgaGVyZSwgb3Igd2lsbCBJIG5lZWQgdG8gZGVsZXRlIGFsbCB0aGUgWWVhcnNfc2Ygb2JqZWN0cyBhbmQgY2hhbmdlIGhvdyBhbGwgdGhhdCBpcyBkb25lPw0KDQpXZWxsLCB3YWl0LiBJIGFscmVhZHkgaGF2ZSBlcmFubnVhbCBhbmQgZ3BwYW5udWFsIGFuZCBpbnVuYW5udWFsIGFuZCB0ZW1wYW5udWFsIGhlcmUgYXMgc3RhcnMuIHNvIEkgdGhpbmsgSSBkb24ndCBuZWVkIHRvIGdvIHdob2xseSByZW1ha2UgdGhpbmdzLiBJbnN0ZWFkLCBob3cgZG8gSSBnZXQgdG8gdGhvc2UgKGFuZCB3aHkgZGlkbid0IEkgdXNlIHRoZW0gYWJvdmU/Pz8tIEkgdGhlbiBnbyBtYWtlIHRoZSBzZnMgd2l0aCB0aGVtLCBidXQgdGhhdCdzIHdoYXQgZ2V0cyBtYWRlIGluc2lkZSB0aGUgcGxvdHRpbmcgZnVuY3Rpb25zLCBzbyBub3Qgc3VyZSB3aHkgSSBuZWVkZWQgdGhlbS4NCg0KDQoqc2NhbGluZyB0aGF0IHdvcmtzIGZvciBhbGwgeWVhcnMgZmFpbHMgdG8gc2hvdyB3aGF0J3MgaGFwcGVuaWduIGJlY2F1c2UgeWVhcnMgYXJlIHNvIGRpZmZlcmVudCoNCmBgYHtyfQ0KeXJ3YW50ZWQgPC0gJzIwMTYtMDYtMjknDQoNCiMgU29ydCBvdXQgdGhlIHNjYWxlcw0KeXJkZXggPC0gd2hpY2goc3RfZ2V0X2RpbWVuc2lvbl92YWx1ZXModGVtcGFubnVhbCwgd2hpY2ggPSAndGltZScpID09IHlyd2FudGVkKQ0KDQp0ZW1wYW5udWFsWywseXJkZXhdDQpjbGltYW5udWFsWywseXJkZXhdDQoNCmludW5hbm51YWxbLCx5cmRleF0NCmludW4xMHBhbm51YWxbLCx5cmRleF0NCg0KIyBOZWVkIHRvIGNhcHR1cmUgdGhlIGVuZG1lbWJlcnMNCmdwcGFubnVhbFsxLCx5cmRleF0NCmdwcGFubnVhbDEwcF9jbGltWywseXJkZXhdDQoNCmVyYW5udWFsWzEsLHlyZGV4XQ0KZXJhbm51YWwxMHBfY2xpbVssLHlyZGV4XQ0KDQojIFRoaXMgaXMgaGFja3ksIGJ1dCBJJ20gZ29pbmcgdG8ganVzdCBmb3JjZSB0aG9zZQ0KDQp0ZW1wbWluIDwtIDI1DQp0ZW1wbWF4IDwtIDM1DQoNCmludW5taW4gPC0gMA0KaW51bm1heCA8LSAyNTAwDQoNCmdwcG1pbiA8LSA1MDANCmdwcG1heCA8LSAyNTAwDQoNCmVybWluIDwtIDUwMA0KZXJtYXggPC0gNTUwMA0KDQoNCmBgYA0KDQojIyMgR1BQDQpgYGB7cn0NCg0KZ3BwQmFzZSA8LSBncHBmdW4oZ3BwYW5udWFsLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBncHBtaW4sIGZvcmNlbWF4ID0gZ3BwbWF4KSAgKw0KICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcsIA0KICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSkNCg0KIyBncHBCYXNlDQoNCmdwcENsaW0gPC0gZ3BwZnVuKGdwcGFubnVhbF9jbGltLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBncHBtaW4sIGZvcmNlbWF4ID0gZ3BwbWF4KSAgKw0KICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcsIA0KICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSkNCg0KIyBncHBDbGltDQoNCmdwcDEwcCA8LSBncHBmdW4oZ3BwYW5udWFsMTBwLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBncHBtaW4sIGZvcmNlbWF4ID0gZ3BwbWF4KSArDQogIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3JpZ2h0JywgDQogICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKQ0KDQojIGdwcDEwcA0KDQpncHAxMHBfY2xpbSA8LSBncHBmdW4oZ3BwYW5udWFsMTBwX2NsaW0sIDEsIA0KICAgICAgICAgICAgICAgICBkYXRld2FudGVkID0geXJ3YW50ZWQsDQogICAgICAgICAgICAgICAgICMgdW5pdHMgPSAndG9ubmVzJywgDQogICAgICAgICAgICAgICAgIHBsb3RQa2cgPSAnZ2dwbG90JywgDQogICAgICAgICAgICAgICAgIHRpdGxlZCA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgIGNvbG9yY2hvaWNlID0gTkEsDQogICAgICAgICAgICAgICAgIGxvZ3NjYWxlID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICBmb3JjZW1pbiA9IGdwcG1pbiwgZm9yY2VtYXggPSBncHBtYXgpICsNCiAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnLCANCiAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCiMgZ3BwMTBwX2NsaW0NCmBgYA0KDQojIyMgRVINCmBgYHtyfQ0KZXJCYXNlIDwtIGVyZnVuKGVyYW5udWFsLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBlcm1pbiwgZm9yY2VtYXggPSBlcm1heCkgICsNCiAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnLCANCiAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCiMgZXJCYXNlDQoNCmVyQ2xpbSA8LSBlcmZ1bihlcmFubnVhbF9jbGltLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBlcm1pbiwgZm9yY2VtYXggPSBlcm1heCkgKw0KICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcsIA0KICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSkNCg0KIyBlckNsaW0NCg0KZXIxMHAgPC0gZXJmdW4oZXJhbm51YWwxMHAsIDEsIA0KICAgICAgICAgICAgICAgICBkYXRld2FudGVkID0geXJ3YW50ZWQsDQogICAgICAgICAgICAgICAgICMgdW5pdHMgPSAndG9ubmVzJywgDQogICAgICAgICAgICAgICAgIHBsb3RQa2cgPSAnZ2dwbG90JywgDQogICAgICAgICAgICAgICAgIHRpdGxlZCA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgIGNvbG9yY2hvaWNlID0gTkEsDQogICAgICAgICAgICAgICAgIGxvZ3NjYWxlID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICBmb3JjZW1pbiA9IGVybWluLCBmb3JjZW1heCA9IGVybWF4KSArDQogIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3JpZ2h0JywgDQogICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKQ0KDQojIGVyMTBwDQoNCmVyMTBwX2NsaW0gPC0gZXJmdW4oZXJhbm51YWwxMHBfY2xpbSwgMSwgDQogICAgICAgICAgICAgICAgIGRhdGV3YW50ZWQgPSB5cndhbnRlZCwNCiAgICAgICAgICAgICAgICAgIyB1bml0cyA9ICd0b25uZXMnLCANCiAgICAgICAgICAgICAgICAgcGxvdFBrZyA9ICdnZ3Bsb3QnLCANCiAgICAgICAgICAgICAgICAgdGl0bGVkID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgY29sb3JjaG9pY2UgPSBOQSwNCiAgICAgICAgICAgICAgICAgbG9nc2NhbGUgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgIGZvcmNlbWluID0gZXJtaW4sIGZvcmNlbWF4ID0gZXJtYXgpICsNCiAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnLCANCiAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCiMgZXIxMHBfY2xpbQ0KYGBgDQoNCiMjIyBJbnB1dHMNCmBgYHtyfQ0KDQp0ZW1weXIgPC0gdGVtcGZ1bih0ZW1wYW5udWFsLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBmb3JjZW1pbiA9IHRlbXBtaW4sIGZvcmNlbWF4ID0gdGVtcG1heCkgKw0KICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcsIA0KICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSkNCg0KIyB0ZW1weXINCg0KY2xpbXlyIDwtIHRlbXBmdW4oY2xpbWFubnVhbCwgMSwgDQogICAgICAgICAgICAgICAgIGRhdGV3YW50ZWQgPSB5cndhbnRlZCwNCiAgICAgICAgICAgICAgICAgIyB1bml0cyA9ICd0b25uZXMnLCANCiAgICAgICAgICAgICAgICAgcGxvdFBrZyA9ICdnZ3Bsb3QnLCANCiAgICAgICAgICAgICAgICAgdGl0bGVkID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgY29sb3JjaG9pY2UgPSBOQSwNCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSB0ZW1wbWluLCBmb3JjZW1heCA9IHRlbXBtYXgpICArDQogIHRoZW1lX2dyZXkoYmFzZV9zaXplID0gOCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3JpZ2h0JywgDQogICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjMsICdjbScpKQ0KDQojIGNsaW15cg0KDQppbnVueXIgPC0gaW51bmZ1bihpbnVuYW5udWFsLCAxLCANCiAgICAgICAgICAgICAgICAgZGF0ZXdhbnRlZCA9IHlyd2FudGVkLA0KICAgICAgICAgICAgICAgICAjIHVuaXRzID0gJ3Rvbm5lcycsIA0KICAgICAgICAgICAgICAgICBwbG90UGtnID0gJ2dncGxvdCcsIA0KICAgICAgICAgICAgICAgICB0aXRsZWQgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICBjb2xvcmNob2ljZSA9IE5BLA0KICAgICAgICAgICAgICAgICBsb2dzY2FsZSA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgZm9yY2VtaW4gPSBpbnVubWluLCBmb3JjZW1heCA9IGludW5tYXgpICsNCiAgdGhlbWVfZ3JleShiYXNlX3NpemUgPSA4KSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAncmlnaHQnLCANCiAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgJ2NtJykpDQoNCiMgaW51bnlyDQoNCmludW4xMHB5ciA8LSBpbnVuZnVuKGludW4xMHBhbm51YWwsIDEsIA0KICAgICAgICAgICAgICAgICBkYXRld2FudGVkID0geXJ3YW50ZWQsDQogICAgICAgICAgICAgICAgICMgdW5pdHMgPSAndG9ubmVzJywgDQogICAgICAgICAgICAgICAgIHBsb3RQa2cgPSAnZ2dwbG90JywgDQogICAgICAgICAgICAgICAgIHRpdGxlZCA9IEZBTFNFLCAgDQogICAgICAgICAgICAgICAgIGNvbG9yY2hvaWNlID0gTkEsDQogICAgICAgICAgICAgICAgIGxvZ3NjYWxlID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICBmb3JjZW1pbiA9IGludW5taW4sIGZvcmNlbWF4ID0gaW51bm1heCkgKw0KICB0aGVtZV9ncmV5KGJhc2Vfc2l6ZSA9IDgpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdyaWdodCcsIA0KICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAnY20nKSkNCg0KIyBpbnVuMTBweXINCmBgYA0KDQoNCiMjIyBNYWtlIHRoZSBwbG90cw0KDQpgYGB7cn0NCmdwcFNjZW5lIDwtIHBsb3Rfc3BhY2VyKCkgKw0KKHRlbXB5ciArIGdndGl0bGUoJ0Jhc2VsaW5lIHRlbXBlcmF0dXJlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArDQogIChjbGlteXIgKyBnZ3RpdGxlKCcyYyB3YXJtaW5nJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArDQogIA0KICAoaW51bnlyICsgZ2d0aXRsZSgnQmFzZWxpbmUgaW51bmRhdGlvbicpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSkgKw0KKGdwcEJhc2UgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArICMgKyBnZ3RpdGxlKCdCYXNlbGluZScpIA0KICAoZ3BwQ2xpbSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsgIyAgKyBnZ3RpdGxlKCcyYyB3YXJtaW5nJykNCiAgDQogIChpbnVuMTBweXIgKyBnZ3RpdGxlKCcxMTAlIGludW5kYXRpb24nKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsNCiAgKGdwcDEwcCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsgIyArIGdndGl0bGUoJzExMCUgaW51bmRhdGlvbicpIA0KICAoZ3BwMTBwX2NsaW0gKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArICMgKyBnZ3RpdGxlKCcyYyAmIDExMCUnKQ0KICBwbG90X2xheW91dChucm93ID0gMykNCmdwcFNjZW5lDQpgYGANCg0KYGBge3J9DQpwZGYoZmlsZS5wYXRoKHNjcmlwdE91dCwgJ2dwcFNjZW5lLnBkZicpLCANCiAgICBvbmVmaWxlID0gRkFMU0UsIGhlaWdodCA9IDE2LzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdXNlRGluZ2JhdHMgPSBGQUxTRSkNCnByaW50KGdwcFNjZW5lKQ0KZGV2Lm9mZigpDQoNCnBuZyhmaWxlLnBhdGgoc2NyaXB0T3V0LCAnZ3BwU2NlbmUucG5nJyksIA0KICAgIGhlaWdodCA9IDE2LzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApDQpwcmludChncHBTY2VuZSkNCmRldi5vZmYoKQ0KYGBgDQoNClNhbWUsIHdpdGggRVINCg0KYGBge3J9DQplclNjZW5lIDwtIHBsb3Rfc3BhY2VyKCkgKw0KKHRlbXB5ciArIGdndGl0bGUoJ0Jhc2VsaW5lIHRlbXBlcmF0dXJlJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArDQogIChjbGlteXIgKyBnZ3RpdGxlKCcyYyB3YXJtaW5nJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArDQogIA0KICAoaW51bnlyICsgZ2d0aXRsZSgnQmFzZWxpbmUgaW51bmRhdGlvbicpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSkgKw0KKGVyQmFzZSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsgIyArIGdndGl0bGUoJ0Jhc2VsaW5lJykgDQogIChlckNsaW0gKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArICMgICsgZ2d0aXRsZSgnMmMgd2FybWluZycpDQogIA0KICAoaW51bjEwcHlyICsgZ2d0aXRsZSgnMTEwJSBpbnVuZGF0aW9uJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpKSArDQogIChlcjEwcCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsgIyArIGdndGl0bGUoJzExMCUgaW51bmRhdGlvbicpIA0KICAoZXIxMHBfY2xpbSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykpICsgIyArIGdndGl0bGUoJzJjICYgMTEwJScpDQogIHBsb3RfbGF5b3V0KG5yb3cgPSAzKQ0KZXJTY2VuZQ0KYGBgDQoNCmBgYHtyfQ0KcGRmKGZpbGUucGF0aChzY3JpcHRPdXQsICdlclNjZW5lLnBkZicpLCANCiAgICBvbmVmaWxlID0gRkFMU0UsIGhlaWdodCA9IDE2LzIuNTQsIHdpZHRoID0gMTYvMi41NCwgdXNlRGluZ2JhdHMgPSBGQUxTRSkNCnByaW50KGVyU2NlbmUpDQpkZXYub2ZmKCkNCg0KcG5nKGZpbGUucGF0aChzY3JpcHRPdXQsICdlclNjZW5lLnBuZycpLCANCiAgICBoZWlnaHQgPSAxNi8yLjU0LCB3aWR0aCA9IDE2LzIuNTQsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQ0KcHJpbnQoZXJTY2VuZSkNCmRldi5vZmYoKQ0KYGBgDQoNCg0KDQo=